Как создать объект диапазона, когда я знаю только смещения символов?

Итак, у меня есть div, который содержит блок текста, ранее пользователь выбрал какой-то текст в этом блоке, и я создал объект диапазона из этого выделения. Я сохранил смещение выбранных текстовых начальных и конечных точек, но у меня возникают проблемы с повторным созданием диапазона (так что я могу манипулировать им). "quotables" - это div, который содержит весь текст. Я не знаю, что я делаю неправильно.



    var theRange = rangy.createRange();
    var node = $('.quotables').html();
    theRange.setStart(node, 14);
    theRange.setEnd(node, 318);


но я продолжаю получать ошибки: Ошибка при неявке: NOT_FOUND_ERR: исключение DOM 8
m.setStart
(анонимная функция)
d.extend._Deferred.f.resolveWith
d.d.extend.ready
d.c.addEventListener.y

Ответ 1

Граница диапазона не является смещением символов в строчном представлении HTML. Скорее, это смещение внутри DOM node. Например, если node является текстом node, граница выражается как смещение символа в тексте node. Если node является элементом, он выражается как число дочерних узлов node до границы. Например, в следующем HTML, с диапазоном, границы которого обозначены символом |:

<div id="test">foo|bar<br>|<br></div>

... граница начала диапазона лежит в смещении 3 в тексте node, который является первым дочерним элементом элемента <div>, а конечная граница лежит со смещением 2 внутри <div>, так как есть два дочерние узлы (текст node "foobar" и один элемент <br>), лежащий перед границей. Вы создадите диапазон программно следующим образом:

var range = rangy.createRange(); // document.createRange() if not using Rangy
var div = document.getElementById("test");
range.setStart(div.firstChild, 3);
range.setEnd(div, 2);