我在Chrome和Safari中遇到此问题(适用于Mozilla和IE + Edge)。
我想使用range=sel.getRangeAt(0);
但是,我在Chrome中遇到以下错误:
Uncaught IndexSizeError: Failed to execute 'getRangeAt' on 'Selection': 0 is not a valid index.
如何以下列方式解决此问题:here。
这是我的 fiddle
我无法使用此方法的原因是因为我显示hidden
div
,并将文本插入<input type="text">
字段,然后将其插入{ {1}} contenteditable
。选择此输入字段会使我保存新选择,并使插入变得混乱。
以下是一些显示问题的图片:
第1部分:div
div字段
第2部分:显示的隐藏div,输入,更改卡特位置
第3部分:Chrome和Safari中的插入,控制台错误
有什么建议吗?
答案 0 :(得分:5)
好的,所以我在你的代码中发现了一个错误,这很简单,但很难找到:)
<强>问题:强>
第46/72行:bE1.focus()不起作用,因此对象Selection.range不存在。 我通过调用console.log(document.activeElement)来检查页面中哪个元素处于活动状态,并且这是错误的元素。
<强>解决方案:强>
更改了bE1.focus() - &gt; div_new_1.focus()
工作示例: jsFiddle
我改变的功能:
function lrestoreRangePosition1() {
closePopupLink1();
div_new_1.focus();
var sel = window.getSelection(),
range = sel.getRangeAt(0);
var x, C, sC = bE1,
eC = bE1;
C = rp.sC;
x = C.length;
while (x--) sC = sC.childNodes[C[x]];
C = rp.eC;
x = C.length;
while (x--) eC = eC.childNodes[C[x]];
range.setStart(sC, rp.sO);
range.setEnd(eC, rp.eO);
sel.removeAllRanges();
sel.addRange(range)
}
function lrestoreRangePositionInsert1() {
var newText1 = document.getElementById('url_title1').value;
var newText2 = document.getElementById('url_content1').value;
var pasteText = "<a href='" + newText2 + "'>" + newText1 + "</a>";
closePopupLink1();
div_new_1.focus();
console.log(document.activeElement)
var sel = window.getSelection(),
range = sel.getRangeAt(0);
var x, C, sC = bE1,
eC = bE1;
C = rp.sC;
x = C.length;
while (x--) sC = sC.childNodes[C[x]];
C = rp.eC;
x = C.length;
while (x--) eC = eC.childNodes[C[x]];
range.setStart(sC, rp.sO);
range.setEnd(eC, rp.eO);
sel.removeAllRanges();
sel.addRange(range);
pasteHtmlAtCaret(pasteText);
}
如果有帮助,请告诉我:)。