Javascript 未捕获索引SizeError:未能执行';getRangeAt';在';选择';:0不是有效的索引

Javascript 未捕获索引SizeError:未能执行';getRangeAt';在';选择';:0不是有效的索引,javascript,Javascript,这里有什么问题 if ( window.getSelection() ) EditField = window.getSelection().getRangeAt(0); 抛出错误: 未捕获索引SizeError:未能对“选择”执行“getRangeAt”:0不是有效索引 问题似乎是WebKit特有的;我无法在IE或Firefox中复制它。正如OP已经提到的,Google Chrome上的错误是: 未捕获的IndexSizeError:未能对“选择”执行“getRangeAt”:0不是有

这里有什么问题

if ( window.getSelection() ) 
  EditField = window.getSelection().getRangeAt(0);
抛出错误:

未捕获索引SizeError:未能对“选择”执行“getRangeAt”:0不是有效索引


问题似乎是WebKit特有的;我无法在IE或Firefox中复制它。正如OP已经提到的,Google Chrome上的错误是:

未捕获的IndexSizeError:未能对“选择”执行“getRangeAt”:0不是有效的索引

Safari也有同样的问题,但信息不同:

索引大小错误:DOM异常1:索引或大小为负值,或大于允许的值

通常发生在简单的所见即所得编辑器中。例如:


我的编辑器中的文本。
单击此按钮可在文本编辑器中插入一些文本:
插入
函数doInsert(文本){
var sel=window.getSelection&&window.getSelection();
如果(sel){
var range=sel.getRangeAt(0);//此处出错
var节点=document.createTextNode(文本);
range.deleteContents();
range.insertNode(节点);
}
}

这里需要考虑的是:您是否在代码中的某个地方禁用了选择功能?如果是这样,在某些情况下,您可能希望首先启用选择,最好是在鼠标向下事件中,或者在获取范围之前,在关注元素之前。这样做解决了我对这个问题的看法

$('#MyEditableDiv').on('mousedown', function (e) {

    $(document).enableSelection();


});

我的项目中有一些解决方案

使用iframe作为所见即所得编辑器

我们将editwin
设置为iframe的窗口

每次在通过代码向编辑器插入内容之前,都应首先使用以下代码

editwin.focus();
editwin.document.body.focus();
使用文本区域作为编辑器

将textobj设置为textarea的dom

同样的方法就像up,但代码不同

textobj.focus();
解决这个问题的确切方法(比如JavaScript中90%的内容)是对象检测;当然,与选择相关的问题并不那么简单:

if (window.getSelection().rangeCount >= 1) {var r = window.getSelection().getRangeAt(0);}

要测试,请在没有选定文本且返回0时,将
window.getSelection().rangeCount
抛出到控制台;如果选择,它将返回1。但是,我不确定您是否能够以及如何使其返回2或更大。

优秀的解决方案伙伴。第二种选择对于在JS方面有丰富经验的人来说似乎很简单,但不知何故从未考虑过。感谢您的想法,是的,这似乎是一个特定于webkit的想法。在Chrome v24中,我收到了与Safari中相同的异常消息。这似乎没有解决这个问题。@JeffreyBosboom使用编辑器焦点,在“选择”上的“getRangeAt”:0不是有效的索引问题,可以在wysiwyg.js的第490行中修复:函数InsertNodeSelection(insertNode,n){document.getElementById('wysiwyg'+n)。focus();//添加这一行