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