javascript setCaret函数不一致

javascript setCaret函数不一致,javascript,html,Javascript,Html,在过去的几天里,我读了无数关于在内容可编辑的div中设置插入符号位置的帖子。最后,我想出了我自己的整洁的小功能,它工作得非常漂亮。。。第一次。如果再次调用该函数,它似乎会突出显示页面中大量看似随机的内容,包括原始div之外的内容。下面是我的代码。如果有人能告诉我哪里出了问题,我会很感激的 (mod变量是内容可编辑div) var startNodeFound=false; var endNodeFound=true; 功能返回焦点(mod、start、end){ mod.focus(); var

在过去的几天里,我读了无数关于在内容可编辑的div中设置插入符号位置的帖子。最后,我想出了我自己的整洁的小功能,它工作得非常漂亮。。。第一次。如果再次调用该函数,它似乎会突出显示页面中大量看似随机的内容,包括原始div之外的内容。下面是我的代码。如果有人能告诉我哪里出了问题,我会很感激的

(mod变量是内容可编辑div)

var startNodeFound=false;
var endNodeFound=true;
功能返回焦点(mod、start、end){
mod.focus();
var range=document.createRange();
var sel=window.getSelection();
setCaret(范围,模式,开始,“开始”,错误);
如果(结束>0){
endNodeFound=false
setCaret(范围,模式,结束,“结束”,错误);
}
选择removeAllRanges();
选择添加范围(范围);
}
函数setCaret(范围、节点、偏移、位置){
var i=0;
var nodeCnt=node.childNodes.length;
而(!startNodeFound | | |!endNodeFound)&&iif(offset找到了解决方案。必须在returnFocus函数的末尾设置startNodeFound=false

var startNodeFound = false;
var endNodeFound = true;

function returnFocus(mod, start, end) {
mod.focus();
var range = document.createRange();
var sel = window.getSelection();

setCaret(range, mod, start, "start", false);
if (end > 0) {
    endNodeFound = false
    setCaret(range, mod, end, "end", false);
}
sel.removeAllRanges();
sel.addRange(range);
}

function setCaret(range, node, offset, position) {
var i = 0;
var nodeCnt = node.childNodes.length;
while ((!startNodeFound || !endNodeFound) && i < nodeCnt) {
    var l = node.childNodes[i].length;
    if (l == undefined) {
        offset = setCaret(range, node.childNodes[i], offset, position)
    } else {
        if (offset <= l) {
            switch (position) {
                case "start":
                    if (!startNodeFound) {
                        startNodeFound = true;
                        range.setStart(node.childNodes[i], offset);
                    }
                    break;
                case "end":
                    if (!endNodeFound) {
                        endNodeFound = true;
                        range.setEnd(node.childNodes[i], offset);
                    }
                    break;
            }
        } else {
            offset -= l
        }
    }
    i++;
}
return offset;
}