Javascript 使用生成器在DOM节点中进行递归字符串搜索

Javascript 使用生成器在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

我目前正试图将注意力集中在es6生成器/迭代器上,因此我编写了一个函数,在节点上搜索特定的测试字符串并返回它

在本文中,搜索“Returns a”的第一个调用是命中的,但第二个调用实际上返回false。在本例中,它返回脚本标记,因为字符串是在JSFIDLE中附加到HTML的脚本标记中找到的

/* *@param{HTMLElement} *@yields{Iterable.} */ 函数*\u深度遍历元素节点{ 如果!节点{ 回来 } 对于let i=0;i{ const parent=document.querySelectorselector; _深横贯元素分离; 对于_deepTraverseElementsparent的常量元素{ if!element.childNodes[0]| | element.childNodes[0].nodeType!==3继续; if元素.childNodes[0].data.indexOftext!=-1返回元素; } 返回false; }; logfindelementbynerText'body',返回一个'; logfindElementByInnerText'body','接口,其中包含一个数字'; Node是一个接口,许多domapi对象类型从中继承;它允许类似地处理这些不同的类型,例如继承相同的方法集,或者以相同的方式进行测试

只读 返回表示基URL的。基本URL的概念从一种语言变为另一种语言;在HTML中,它对应于协议、域名和目录结构,直到最后一个“/”为止。 不适用于web内容。表示元素的基本URI的只读对象。 只读 返回一个包含此节点所有子节点的活动节点。处于活动状态意味着如果节点的子节点发生更改,对象将自动更新。 只读 返回表示该节点的第一个直接子节点的值,如果该节点没有子节点,则返回null。 只读 返回表示该节点的最后一个直接子节点的值,如果该节点没有子节点,则返回null。 只读 返回表示树中下一个节点的值,如果没有这样的节点,则返回null。 只读 返回包含节点名称的。名称的结构将因节点类型而异。例如,An将包含相应标签的名称,如An的“音频”,节点将具有“文本”字符串,或者节点将具有“文档”字符串。 表示节点主体的。 只读 返回表示节点类型的无符号短字符。可能的值为: 名称 价值 元素节点 1. 属性节点 2. 文本节点 3. CDATA\u节\u节点 4. 实体\引用\节点 5. 实体节点 6. 处理\u指令\u节点 7. 注释节点 8. 文档节点 9 文档类型节点 10 文档\u片段\u节点 11 节点符号 12 返回/设置当前节点的值 只读 返回此节点所属的。如果没有与之关联的文档,则返回null。 只读 返回此节点的父节点。如果没有这样的节点,例如如果此节点位于树的顶部,或者如果不参与树,则此属性返回null。 只读 返回此节点的父节点。如果节点没有父节点,或者该父节点不是,则此属性返回null。 只读 返回表示树中上一个节点的值,如果没有这样的节点,则返回null。 返回/设置元素及其所有子元素的文本内容。
正如注释中提到的,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函数返回