Вам необходимо выполнить цикл для каждого дочернего узла, начиная с корневого элемента, чтобы вы могли сделать это, проверив, имеет ли текущий узел childNodes
, теперь, чтобы получить текст внутри узла, вы можете проверить их nodeType
,проверьте это Документация по NodeType , это поможет вам понять, какие узлы есть в DOM, поэтому рабочий код для сбора всех текстовых узлов может быть:
const root = document.querySelector('body');
const queue = [root];
const textNodes = [];
const NODE_TEXT = 3;
while(queue.length) {
const node = queue.shift();
const children = node.childNodes;
if (children && children.length > 0) {
const childrenAsArray = Array.prototype.slice.call(children);
Array.prototype.push.apply(queue, childrenAsArray);
}
if (node.nodeType === NODE_TEXT) {
textNodes.push(node);
}
}
// finally you can console.log all the text nodes collected
console.log(textNodes);
Если выЗапустите этот код на любом сайте в инструментах разработчика консоли Chrome, вы можете разместить весь текстовый узел на сайте.
Надеюсь, вы найдете его полезным.
РЕДАКТИРОВАТЬ
чтобы получить текстовое значение для каждого узла, вы должны сначала проверить некоторые правила, прежде чем получать текст, поэтому давайте начнем.
- исключите
script
, 'style', 'noscript' иcode
tags - проверить, есть ли у текущего узла один дочерний узел
- проверить, является ли дочерний узел текстовым узлом (NODE_TEXT = 3)
- проверить, является ли дочерний узелне пусто
Итак, начнем, надстройкаg эти правила
const root = document.querySelector('body');
const queue = [root];
const textNodes = [];
const NODE_TEXT = 3;
const exclude = ["SCRIPT", "STYLE", "CODE", "NOSCRIPT"]; // add exclude tags
// check if node is not the exclude one
function isNodeAllow(node){
return exclude.indexOf(node.tagName) === -1;
}
// define a helper function to check if has one child node
function hasOneChildNode(node){
return node.childNodes && node.childNodes.length === 1;
}
// check if node is not the exclude one
function isChildNodeText(node){
return node.childNodes[0].nodeType === NODE_TEXT;
}
// check if node is not the exclude one
function isNotEmpty(node){
return Boolean(node.innerText.trim());
}
while(queue.length) {
const node = queue.shift();
const children = node.children;
if (children && children.length > 0) {
const childrenAsArray = Array.prototype.slice.call(children);
Array.prototype.push.apply(queue, childrenAsArray);
}
if (isNodeAllow(node) && hasOneChildNode(node) && isChildNodeText(node) && isNotEmpty(node)) {
// here you can translate the text.
// node.innerText will return the text to be translated
textNodes.push(node);
}
}
// finally you can have all the collected text into the site
console.log(textNodes)
Надеюсь, это поможет вам.