JavaScript - 只有在使用alert()时才能正常工作

4
我正在尝试处理iframe中的contenteditable正文,以防止在按Enter键时浏览器自行添加brpdiv。但是,在尝试重置焦点时会出现奇怪的情况,只有在处理其余代码之前进行alert()时才能正常工作。我认为这是因为JavaScript需要一些时间来进行操作,但必须有一种方法可以在不“休眠”脚本的情况下完成它...
以下是我的代码(使用JQuery),只有带“magic 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(它太长了)
编辑:当我移除Magic Alerts后,在Chrome中仍然有效,但在Firefox中它会聚焦于所有内容的开头!(就像偏移量为0一样)
更新:
看起来问题出在将换行符替换为 ```br``` 标签的那一行代码上。如果我删除这行代码,即使没有警报,它也可以完美地工作。我需要保留这些 ```br``` 标签,有没有其他方法可以做到这一点?

console.log 做的是同样的事情吗? - Alexandre Khoury
1
如果您省略警告,会发生什么?错误信息是什么? - Christoph
@Mageek 我不知道这是什么...(在这里我有答案,我会尝试一下 - http://stackoverflow.com/questions/4743730/javascript-what-is-console-log-and-how-do-i-use-it)谢谢! - Kenedy
@Christoph 抱歉!...我忘了说,但是我的问题现在已经更新了。当我省略它们时,没有错误消息,但它不能正常工作。 - Kenedy
我认为alert语句给代码执行时间。 - Alexandre Khoury
是的...我也这么认为,但必须有一种方法可以在不使代码休眠的情况下获得它。我的意思是,不需要额外的时间。谢啦! - Kenedy
1个回答

1

这个问题只是你的一个小问题。所以你应该结合文档和窗口:

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

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

嗯嗯嗯...谢谢,我读了两遍但还没理解(我现在会慢慢读)。在定义变量时,“||”的信息在哪里可以找到?它是做什么用的?...我也不理解你代码的最后一行。我需要使用它来获取Iframe选择吗?无论如何,我会再次阅读它...但如果您能帮忙的话(如果您能),那就太好了...非常感谢。 - Kenedy
所以...问题在于我的代码获取iframe选择太耗时间了? - Kenedy
在JavaScript中,如果某个值为null/undefined,则可以使用||代替长的构造方式来提供默认值。例如,如果x为null,则我们可以执行x || 5以获取5而不是null。因此,为了兼容IE,我们采用其中一个属性。另一个技巧是''+iwin.getSelection() - 这意味着您将对象转换为字符串。 - Dewfy
我想我知道真正的问题出在哪了...我会再次更新我的答案。抱歉。 - Kenedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接