Ответ 1
var extractTextNodes = function(paragraph) {
var nodes = [];
function callback(node) {
if (node.nodeType === Node.TEXT_NODE) {
nodes.push(node);
} else if (node.nodeType === Node.ELEMENT_NODE) {
node.childNodes.forEach(callback);
}
}
paragraph.childNodes.forEach(callback);
return nodes;
};
var findParentParagraph = function(node) {
var parent = node.parentElement;
while (parent) {
if (parent.tagName === "P") {
return parent;
}
parent = parent.parentElement;
}
return null;
};
var areTextNodesSiblings = function(textNode1, textNode2) {
var p = findParentParagraph(textNode1);
if (!p) {
return false;
}
var allTextNodes = extractTextNodes(p);
var index1 = allTextNodes.indexOf(textNode1);
var index2 = allTextNodes.indexOf(textNode2);
if (index2 === -1) {
return false;
}
return (index1 === index2 - 1) || (index1 === index2 + 1);
};
И просто вызовите areTextNodesSiblings
, передав узлы.
Скрипка: https://jsfiddle.net/krmnve37/1/
Название гласит "визуально последовательный", но "отредактированный 2. контекст" говорит, что узлы должны быть в одном абзаце. Следующая функция проверит, находятся ли два узла в одном и том же абзаце, а не находятся ли они рядом друг с другом:
var areTextNodesInTheSameParagraph = function(textNode1, textNode2) {
var p = findParentParagraph(textNode1);
if (!p) {
return false;
}
var allTextNodes = extractTextNodes(p);
var index1 = allTextNodes.indexOf(textNode1);
var index2 = allTextNodes.indexOf(textNode2);
return index1 > -1 || index2 > -1;
};