Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在firefox中使用范围对象设置光标位置会将光标锁定到位_Javascript_Contenteditable - Fatal编程技术网

Javascript 在firefox中使用范围对象设置光标位置会将光标锁定到位

Javascript 在firefox中使用范围对象设置光标位置会将光标锁定到位,javascript,contenteditable,Javascript,Contenteditable,我试图将光标放置在contenteditable节点中的特定字符位置,代码在Chrome中运行良好。但在Firefox中,当我放置光标时,它会将光标锁定在适当的位置,因此当我从右向左键入光标时,它似乎会锁定(因此键入“hello world”将生成“dlrow olleh” 直到我尝试使用箭头键并意识到它不是在RTL模式下,而是锁定了光标的位置,才知道发生了什么。不过,退格键似乎工作正常,当我单击其他位置时,光标按预期移动,功能恢复正常。我不确定这是否是预期的在firefox中编辑行为,或者我做

我试图将光标放置在contenteditable节点中的特定字符位置,代码在Chrome中运行良好。但在Firefox中,当我放置光标时,它会将光标锁定在适当的位置,因此当我从右向左键入光标时,它似乎会锁定(因此键入“hello world”将生成“dlrow olleh”

直到我尝试使用箭头键并意识到它不是在RTL模式下,而是锁定了光标的位置,才知道发生了什么。不过,退格键似乎工作正常,当我单击其他位置时,光标按预期移动,功能恢复正常。我不确定这是否是预期的在firefox中编辑行为,或者我做错了什么。(同样,在Chrome中,我可以在光标放置后开始键入,并且行为符合我的预期)

我最初是使用rangy编写的,但失败后(使用上述结果),我尝试使用中找到的代码,粘贴如下:

function getTextNodesIn(node) {
    var textNodes = [];
    if (node.nodeType == 3) {
        textNodes.push(node);
    } else {
        var children = node.childNodes;
        for (var i = 0, len = children.length; i < len; ++i) {
            textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
        }
    }
    return textNodes;
}

function setSelectionRange(el, start, end) {
    if (document.createRange && window.getSelection) {
        var range = document.createRange();
        range.selectNodeContents(el);
        var textNodes = getTextNodesIn(el);
        var foundStart = false;
        var charCount = 0, endCharCount;

        for (var i = 0, textNode; textNode = textNodes[i++]; ) {
            endCharCount = charCount + textNode.length;
            if (!foundStart && start >= charCount
                    && (start < endCharCount ||
                    (start == endCharCount && i < textNodes.length))) {
                range.setStart(textNode, start - charCount);
                foundStart = true;
            }
            if (foundStart && end <= endCharCount) {
                range.setEnd(textNode, end - charCount);
                break;
            }
            charCount = endCharCount;
        }

        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (document.selection && document.body.createTextRange) {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(true);
        textRange.moveEnd("character", end);
        textRange.moveStart("character", start);
        textRange.select();
    }
}
函数getTextNodesIn(节点){ var textNodes=[]; if(node.nodeType==3){ textNodes.push(节点); }否则{ var children=node.childNodes; for(变量i=0,len=children.length;i=charCount &&(开始<结束字符计数|| (start==endCharCount&&i