Как использовать jQuery prevAll () для выбора соседних текстовых узлов? - PullRequest
4 голосов
/ 19 октября 2010

Я получаю текстовый узел (node.nodeType == 3), возвращаемый из диапазона getSelection, например ::

var selectionRange = selection.getRangeAt(0);
var startContainer = selectionRange.startContainer;

Этот startContainer обычно является текстовым узлом, например, следующим html:

<p>Paragraph in <u>parag</u>raph.</p>

Результатом будет текстовый узел с текстом «raph».если |обозначает выделение:

<p>Paragraph in <u>parag</u>r|aph|.</p>

Правильно, выделенный текст является aph, а текстовый узел raph., потому что перед raph есть новый текстовый узел внутри u-узла.

Теперь, при вызове $(startContainer).prevAll().each(function(index, node) ... я ожидал, что это вернет U (который содержит текстовый узел с parag) и другой текстовый узел (который содержит Paragraph in).

Однако он возвращает только U, а не текстовый узел дляслева от него.

Почему это?Как получить все узлы одного уровня перед моим startContainer, включая текстовые узлы с jQuery?

Ответы [ 2 ]

6 голосов
/ 19 октября 2010

Благодаря Пойнти, чей ответ я принял, я придумал следующее:

var left = true;
                        var leftNodes = [];
                        var rightNodes = [];
                        $(startContainer).parent().contents().each(function(index, node) {
                            if (!left) { //right
                                rightNodes.push(node);
                            }
                            else if ((node.isSameNode(startContainer)) && (left)) {
                                left = false;
                            }
                            else { //left
                                leftNodes.push(node);
                            }
                        });
4 голосов
/ 19 октября 2010

В общем, jQuery - это манипулирование элементами DOM. Он старается изо всех сил (большую часть времени функция .text() является очевидным исключением) для игнорирования текстовых узлов, особенно в семействе функций "DOM Navigation".

Здесь - это более старый вопрос Stackoverflow, который может помочь вам собрать некоторый код для поиска текстовых узлов. Как вы видите в этом вопросе, функция jQuery .contents() включает текстовые узлы. Таким образом, вы можете сделать что-то вроде перехода к родителю вашего текстового узла и получения его содержимого таким образом, затем из этого набора детей вы можете «найти себя» и определить ближайших соседей и т. Д.

...