Хотя ответ @ Лукаса хорош, многое упущено, что позволило бы вам успешно его использовать. Узел, в котором начинается выбор, должен быть точным, а не родительским. В нашем случае мы пытались поместить какой-либо текст в элемент управления TextAngular, а затем выбрать текст, который выглядел как ____, чтобы пользователь мог «заполнить пробел».
Наш ввод был html порядка <p>Some text goes here: _____</p>
или
<p>Some partial goes here
<ul>
<li>Option 1</li>
<li>_____</li>
</ul>
Чтобы это сработало, нам нужно было написать что-то, чтобы найти подчеркивание в нужном элементе
function find_(node) {
var i, n;
// return the node with the _'s
for(i=0; i < node.childNodes.length; ++i) {
n = node.childNodes[i];
console.debug(n);
if(n.textContent) {
console.debug(n, n.textContent);
if(n.textContent.search(/___+/) > 0) {
return n;
}
}
if(n.childNodes) {
console.debug(n, n.childNodes);
n = find_(n);
if(n) {
return n;
}
}
}
return null;
}
Так что, в конце концов, найти узел, удовлетворяющий <get the node the selection starts in>
, было намного больше работы, чем это простое предложение заставило меня поверить.
В случае <ul>
. узел, содержащий ____, является firstChild узла li.
Я поместил это здесь, чтобы помочь другим, которые должны сделать это, не удивляясь, почему они получают сообщение об ошибке
IndexSizeError: Failed to execute 'setStart' on 'Range': There is no child at offset 65.
Когда проблема в том, что они просто смотрят не на тот узел.