作为Select range in contenteditable div
的后续行动Stackoverflow不允许我评论蒂姆的答案"但是我只是尝试了Tims代码进入jsfiddle并且我没有看到它工作现在在Chrome或Edge上,也许它可以在早期的浏览器上运行
var mainDiv = document.getElementById("main");
var startNode = mainDiv.firstChild.firstChild;
var endNode = mainDiv.childNodes[2].firstChild;
var range = document.createRange();
range.setStart(startNode, 6); // 6 is the offset of "world" within "Hello world"
range.setEnd(endNode, 7); // 7 is the length of "this is"
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
https://jsfiddle.net/Abeeee/zc7kwar8/1/
Edge抛出控制台错误"无效的参数"指向range.setStart命令(第6行),Chrome控制台说" Uncaught TypeError:无法执行' setStart'在'范围':参数1不是类型'节点'"在相同的range.setStart行。
有没有人建议如何在现代"浏览器吗? (Chrome版本62.0.3202.94(官方版本)(64位))
谢谢安倍
答案 0 :(得分:1)
请注意,HTML中标记之间的空格会在元素之间创建textNode
,并且在使用childNodes
时会将这些空格视为子项。您的startNode
和endNode
变量实际上是null
,因为mainDiv.firstChild
指的是textNode,而textNodes没有子节点。您的变量应该是:
var startNode = mainDiv.childNodes[1].firstChild;
var endNode = mainDiv.childNodes[5].firstChild;
请参阅更新后的JSFiddle:https://jsfiddle.net/zc7kwar8/3/
答案 1 :(得分:1)
实际上startNode
和endNode
是undefined
,因为mainDiv.firstChild
和mainDiv.childNodes[2]
指向了2个没有孩子的文本节点元素,这就是为什么你会通过调用undefined
来获得firstChild
。
事实上,这些text
节点是通过您在所有代码之间换行来创建的,因此您需要指向右侧elements
。
这是您应该如何定义startNode
和endNode
:
var mainDiv = document.getElementById("main");
var startNode = mainDiv.childNodes[1].firstChild;
var endNode = mainDiv.childNodes[5].firstChild;
<强>演示:强>
var mainDiv = document.getElementById("main");
var startNode = mainDiv.childNodes[1].firstChild;
var endNode = mainDiv.childNodes[5].firstChild;
console.dir(mainDiv.childNodes);
console.log(endNode);
var range = document.createRange();
range.setStart(startNode, 6); // 6 is the offset of "world" within "Hello world"
range.setEnd(endNode, 7); // 7 is the length of "this is"
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
<div id="main" contenteditable="true" style="border:solid 1px black; width:300px; height:300px">
<div id='one'>Hello world!</div>
<div id='two'>
<br>
</div>
<div id='three'>This is a paragraph</div>
</div>