Javascript-仅当我执行警报()时才起作用

Javascript-仅当我执行警报()时才起作用,javascript,alert,Javascript,Alert,我试图在iframe中处理contenteditable主体,以防止浏览器在按Enter键时自行添加br、p或div。但是,在尝试重置焦点时会发生一些奇怪的事情,在处理其余代码之前发出警报()时,它确实起作用。我认为这是因为javascript需要一些时间来进行操作,但必须有一种方法可以在不“睡眠”脚本的情况下完成操作 在这里,我粘贴了我的代码(使用Jquery),只有使用“魔法警报”它才能完美地工作: //PREVENT DEFAULT STUFF var iframewindow=docum

我试图在iframe中处理contenteditable主体,以防止浏览器在按Enter键时自行添加
br
p
div
。但是,在尝试重置焦点时会发生一些奇怪的事情,在处理其余代码之前发出警报()时,它确实起作用。我认为这是因为javascript需要一些时间来进行操作,但必须有一种方法可以在不“睡眠”脚本的情况下完成操作

在这里,我粘贴了我的代码(使用Jquery),只有使用“魔法警报”它才能完美地工作:

//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 );
}
});
//防止默认内容
var iframewindow=document.getElementById('rte').contentWindow;
var输入=iframewindow.document.body;
$(输入)。按键(功能(e){
变量选择、节点、偏移量、文本、文本前、文本后、范围;
//选择对象
sel=iframewindow.getSelection();
警报(sel);//魔法警报
//包含插入符号的节点
节点=选择锚点节点;
警报(节点);//魔法警报
//如果在插入符号位于输入字段内时按ENTER键
if(node.parentNode==input&&e.keyCode==13){
//阻止浏览器自行插入、或
e、 预防默认值(); //节点内的插入符号位置 偏移量=选择锚定偏移量; //在该位置插入“\n”字符 text=node.textContent; textBefore=text.slice(0,偏移量); textfafter=text.slice(偏移量)| |“”; node.textContent=textBefore+'\n'+textAfter; SEEREF=SEEREF.replace(/\n/g,“
”); //将插入符号放在该新字符之后 range=iframewindow.document.createRange(); range.setStart(节点,偏移量+4); range.setEnd(节点,偏移量+4); //更新所选内容 选择removeAllRanges(); 选择添加范围(范围); } });
请参见ref=framewindow.document.body.innerHTML(太长)

编辑 当我删除魔法警报时,它仍然在Chrome上工作,但在FF中它关注的是所有的开始!(如偏移量=0)

更新

问题似乎是用
br
标记替换换行符的行。如果我删除此行,即使没有警报,它也能正常工作。我需要保留这个
br
标签,还有其他方法吗?

这是你的窄标签。因此,您应该将doc和win结合起来:

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

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

console.log
是否也在执行相同的操作?如果忽略警报会发生什么情况?错误信息是什么?@Mageek我不知道这是什么。。。(这里我有答案,我会试试看)谢谢@克里斯托夫:对不起!。。。我忘了说了,但我的问题现在更新了。当我省略它们时,会出现任何错误消息,但它的工作方式不好。我认为
警报
会给代码留出时间来执行。jmmm。。。谢谢,我读了两遍,但还不明白(我现在要读慢一点)。定义变量时,在哪里可以找到有关“| |”的信息?它有什么作用?。。。我也不明白你代码的最后一行。我是否需要使用此选项来获取Iframe选择?。不管怎样,我还是要再读一遍。。。但是你的帮助(如果你可以的话)又会很好。。。非常感谢,所以。。问题是我的代码花费了太多的时间来获取iframe选择?
| |
可以在javascript中使用,而不是在某些值为null/未定义的情况下使用长构造-提供默认值。例如,如果
x
为空,我们可以执行
x | | 5
得到5而不是空。因此,对于ie兼容性,我们采用一种或另一种属性。关于
''+iwin.getSelection()
的另一个技巧-意味着将对象强制转换为string我想我知道真正的问题在哪里。。。我会再次更新我的答案。很抱歉