Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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 在contenteditable div中选择文本_Javascript_Jquery_Html_Rangy - Fatal编程技术网

Javascript 在contenteditable div中选择文本

Javascript 在contenteditable div中选择文本,javascript,jquery,html,rangy,Javascript,Jquery,Html,Rangy,我需要能够在给定光标位置和数字的div中选择文本。我在这里已经试过很多例子,它们都有一个问题:如果你在新行的开头,选择从上一行的最后一个字符一直到当前字符插入符号位置,如果中间有任何换行符,它们将在选择后插入文本时被清除,因此,文本将插入到前一行的末尾 我使用的代码是从Tim开始的,但它有一个主要的警告,它不会跳过任何换行符,因此在选择范围时,也会选择这些换行符。我需要找到一种只选择文本的方法,并且在前一个字符之前不扩展选择 function createRangeFromCharacterIn

我需要能够在给定光标位置和数字的div中选择文本。我在这里已经试过很多例子,它们都有一个问题:如果你在新行的开头,选择从上一行的最后一个字符一直到当前字符插入符号位置,如果中间有任何换行符,它们将在选择后插入文本时被清除,因此,文本将插入到前一行的末尾

我使用的代码是从Tim开始的,但它有一个主要的警告,它不会跳过任何换行符,因此在选择范围时,也会选择这些换行符。我需要找到一种只选择文本的方法,并且在前一个字符之前不扩展选择

function createRangeFromCharacterIndices(containerEl, start, end) {
    var charIndex = 0,
      range = document.createRange(),
      foundStart = false,
      stop = {};

    range.setStart(containerEl, 0);
    range.collapse(true);

    function traverseTextNodes(node) {
        if (node.nodeType == 3) {
            var nextCharIndex = charIndex + node.length;
            if (!foundStart && start >= charIndex && start <= nextCharIndex) {
                range.setStart(node, start - charIndex);
                foundStart = true;
            }
            if (foundStart && end >= charIndex && end <= nextCharIndex) {
                range.setEnd(node, end - charIndex);
                throw stop;
            }
            charIndex = nextCharIndex;
        } else {
            for (var i = 0, len = node.childNodes.length; i < len; ++i) {
                traverseTextNodes(node.childNodes[i]);
            }
        }
    }

    try {
        traverseTextNodes(containerEl);
    } catch (ex) {
        if (ex == stop) {
            return range;
        } else {
            throw ex;
        }
    }
}

除非我误解了代码,否则CreateRangeFromCharacteristics只是通过查看浏览器显示的文本来解释开始和结束。也就是说,如果你有foobar,那么b字母被认为是字符3。它将其转换为DOM例程想要的:b将是bar的文本节点的字符0。最好在问题中明确这一点,而不是让人们阅读代码来理解它。还有,在你的课文中,什么构成了新行?A.一个新的的开始?既然你已经标记了这个Rangy,你有没有看Rangy TextRange模块?@Louis将是一个新的行。这种情况是,在text2中,当选择text2中的第一个“t”时,它也会选择,从而删除该行break@TimDown我查看了模块,但无法使其工作,您有任何示例吗?谢谢