Javascript 使用生成器在DOM节点中进行递归字符串搜索
我目前正试图将注意力集中在es6生成器/迭代器上,因此我编写了一个函数,在节点上搜索特定的测试字符串并返回它 在本文中,搜索“Returns a”的第一个调用是命中的,但第二个调用实际上返回false。在本例中,它返回脚本标记,因为字符串是在JSFIDLE中附加到HTML的脚本标记中找到的 /* *@param{HTMLElement} *@yields{Iterable.} */ 函数*\u深度遍历元素节点{ 如果!节点{ 回来 } 对于let i=0;iJavascript 使用生成器在DOM节点中进行递归字符串搜索,javascript,ecmascript-6,Javascript,Ecmascript 6,我目前正试图将注意力集中在es6生成器/迭代器上,因此我编写了一个函数,在节点上搜索特定的测试字符串并返回它 在本文中,搜索“Returns a”的第一个调用是命中的,但第二个调用实际上返回false。在本例中,它返回脚本标记,因为字符串是在JSFIDLE中附加到HTML的脚本标记中找到的 /* *@param{HTMLElement} *@yields{Iterable.} */ 函数*\u深度遍历元素节点{ 如果!节点{ 回来 } 对于let i=0;i{ const parent=doc
正如注释中提到的,find函数不起作用,因为它只查看每个元素的第一个子元素,而生成器也会做一些奇怪的事情 我建议避免处理文本节点,只使用访问元素中的文本,而不管其子结构如何。这还允许您跨多个节点查找搜索词。为了获得最深的一个,而不仅仅是包含短语的整个文档,生成器应该使用后序深度优先遍历:
function* traverseElements(node) {
if (node.nodeType != 1) return; // only consider Element nodes
for (let i = 0; i < node.children.length; i++)
yield* traverseElements(node.children[i]); // get all descendants
yield node; // afterwards yield node itself
}
function findElementWithText(root, text) {
for (const element of traverseElements(root))
if (element.textContent.includes(text))
return element;
return null;
}
console.log(findElementWithText(document.body, 'Returns a'));
console.log(findElementWithText(document.body, 'interface from which a number'));
val=节点;如果val.children没有太大意义,那么well元素.childNodes[0]对于该元素是元素,其.nodeType不是3,因此该元素永远不会被认为是返回的。哦,这是有意义的。那么,我该如何切实地获得这些元素的价值呢?试过了,效果很好。我不知道 但我真的不明白为什么。生成器是否应该首先生成dl,因为它包含字符串“Returns a”?yield*应该首先将dl推入返回的迭代器,然后。。。在我的理解中,应该由find函数返回