2013-10-14 4 views
1

Я использую методы выбора Javascript и хочу сохранить выбор пользователя даже после обновления страницы. Я добавил уникальный идентификатор каждый элемент html на странице. После выбора пользователя я сохраняю идентификатор anchorNode, focusNode и смещения. Затем я хочу восстановить выбор, используя классы Range и Selection. Проблема: Например, если уJavascript - выбор - идентифицировать текстовый узел

<div id="u1">hello <i id="u2">italic</i> word!</div> 

И выбранный LLO наклонного вра пользователя, anchorOffset будет 2, focusOffset будет 3, потому что у нас есть 3 текстовых узлов внутри от дел. Итак, как определить текстовые узлы? У меня будет идентификатор u1 (родительский идентификатор), но как узнать, к какому текстовому узлу относится смещение? Благодарю.

ответ

0

Вы можете использовать Serializer module из моей библиотеки Rangy или подход, который он использует, что объясняется в документации. Он немного похож на XPath.

+0

Нет, я не могу ... потому что в то время как пользователь отсутствовал, текст может быть изменен. .. В таком случае все данные Serializer будут сломаны (потому что DOM будет немного другим) – Volodymyr

+0

@Volodymyr: OK. Итак, что можно и не может изменить между сохранением и восстановлением выбора? –

+0

Я могу сохранить идентификатор родительского тега и смещения. Например, если структура

some small text
, я могу сохранить baseId u1, baseOffset - начало выбора пользователя, focusId - u1, focusOffset - конец выбора пользователя. Затем с этими 4 значениями я могу создать объект Selection и использовать плагин Rangy Highlighter, чтобы выделить выделение. Но если тег имеет структуру, показанную в моем вопросе, она не работает, потому что у нее есть 3 текстовыхNode, и я не знаю, как определить, какой из них использовать textNode ... – Volodymyr

0

Мы можем определить позицию, если текст узла в родительском сНу selectedText - экземпляр Calss Selection

var selectedStartNodeText = selectedText.anchorNode.textContent; 
var startTextNodeId = 0; 
$.each(selectedText.anchorNode.parentNode.childNodes, function(i, n){ 
     if(n.textContent == selectedStartNodeText) { 
       startTextNodeId = i; 
     } 
}); 
Смежные вопросы