2012-07-03 4 views
4

Я пытаюсь обработать контент-контент в iframe, чтобы браузеры не добавляли br, p или div самостоятельно при нажатии Enter. Но что-то странное происходит при попытке сбросить фокус, и он просто работает при создании предупреждения() перед обработкой остальной части кода. Я думаю, что это связано с тем, что javascript нужно некоторое время для выполнения операций, но должен быть способ сделать это без «спящего» сценария ...Javascript - работает только в том случае, если я делаю предупреждение()

Здесь я вставляю свой код (работая с JQuery), только С помощью кнопки " магия Alerts»она прекрасно работает:

//PREVENT DEFAULT STUFF 
var iframewindow=document.getElementById('rte').contentWindow; 
var input = iframewindow.document.body; 

$(input).keypress(function (e) { 
var sel, node, offset, text, textBefore, textAfter, range; 
// the Selection object 
sel = iframewindow.getSelection(); 
alert(sel); //MAGIC ALERT 

// the node that contains the caret 
node = sel.anchorNode; 
alert(node); //MAGIC ALERT 

// if ENTER was pressed while the caret was inside the input field 
if (node.parentNode === input && e.keyCode === 13) { 
    // prevent the browsers from inserting <div>, <p>, or <br> on their own 
    e.preventDefault(); 

    // the caret position inside the node 
    offset = sel.anchorOffset; 

    // insert a '\n' character at that position 
    text = node.textContent; 
    textBefore = text.slice(0, offset); 
    textAfter = text.slice(offset) || ' '; 
    node.textContent = textBefore + '\n' + textAfter; 
SEEREF=SEEREF.replace(/\n/g, "<br>"); 
// position the caret after that newBR character 
range = iframewindow.document.createRange(); 
range.setStart(node, offset + 4); 
range.setEnd(node, offset + 4); 

// update the selection 
sel.removeAllRanges(); 
sel.addRange(range); 
} 
}); 

SEEREF = framewindow.document.body.innerHTML (это было слишком долго)

Редактировать Когда я удалить Оповещения Волшебные он все еще работает на Chrome , но в FF он фокусируется на начале всех! (Как если бы это было смещение = 0)

UPDATE

Похоже, что porblem является линия, которая заменяет переводы строк с br тегов. Если я удалю эту строку, она отлично работает даже без предупреждений. Мне нужно сохранить эти теги br, есть ли другой способ сделать это?

+0

Является ли 'console.log' делать то же самое? – Mageek

+1

Что произойдет, если вы опустите предупреждения? Что такое сообщение об ошибке? – Christoph

+0

@Mageek Я не знал, что это такое ... (здесь у меня есть ответ, и я попробую - http://stackoverflow.com/questions/4743730/javascript-what-is-console-log-and-how -do-i-use-it) спасибо! – Kenedy

ответ

1

Этот номер question является узким. Итак, вы должны совместить doc & win:

var idoc= iframe.contentDocument || iframe.contentWindow.document; // ie compatibility 
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView; 

... idoc.getSelection() +(''+iwin.getSelection()) //firefox fix 
+0

jmmm ... спасибо, я прочитал его дважды, но еще не понял (теперь я буду читать его медленнее). Где я могу найти информацию о "||" при определении var? что он делает? ... Я также не понимаю последнюю строку вашего кода. Нужно ли использовать это, чтобы получить выбор Iframe ?. В любом случае, я собираюсь прочитать его снова ... но ваша помощь (если возможно) будет великолепной снова ... большое вам спасибо. – Kenedy

+0

Итак, проблема в том, что мой код занимает слишком много времени, чтобы получить выбор iframe? – Kenedy

+0

'||' может использоваться в javascript вместо длинной конструкции, если какое-либо значение равно null/undefined - предоставлять значение по умолчанию. Например, если 'x' равно null, мы можем сделать' x || 5', чтобы получить 5 вместо null. Итак, для совместимости мы берем то или иное свойство. Еще один трюк о '' '+ iwin.getSelection() '- означает, что вы бросаете объект в строку – Dewfy

Смежные вопросы