gpt4 book ai didi

javascript - 如何在找到第一个匹配项时停止 DOM 搜索循环?

转载 作者:行者123 更新时间:2023-12-02 19:12:53 26 4
gpt4 key购买 nike

我修改了 dom 搜索/替换脚本,以通过文档中的链接替换与其匹配的多个关键字。

它在没有任何 <div> 的情况下工作得很好或<p> ,但是结构复杂,每个节点的关键字都会被替换...

这是一个example

正如您所看到的,同一个关键字不会在一个元素中链接多次,但当存在一些其他元素时,关键字会链接...

这是脚本

(function(){
// don't replace text within these tags
var skipTags = { 'a': 1, 'style': 1, 'script': 1, 'iframe': 1, 'meta':1, 'title':1, 'img':1, 'h1':1 };
// find text nodes to apply replFn to
function findKW( el, term, replFn )
{
var child, tag;
if(!found)var found=false;
for (var i = 0;i<=el.childNodes.length - 1 && !found; i++)
{
child = el.childNodes[i];
if (child.nodeType == 1)
{ // ELEMENT_NODE
tag = child.nodeName.toLowerCase();
if (!(tag in skipTags))
{
findKW(child, term, replFn);
}
}
else if (child.nodeType == 3)
{ // TEXT_NODE
found=replaceKW(child, term, replFn);
}
}
};
// replace terms in text according to replFn
function replaceKW( text, term, replFn)
{
var match,
matches = [],found=false;
while (match = term.exec(text.data))
{
matches.push(match);
}
for (var i = 0;i<=matches.length - 1 && !found; i++)
{
match = matches[i];
// cut out the text node to replace
text.splitText(match.index);
text.nextSibling.splitText(match[1].length);
text.parentNode.replaceChild(replFn(match[1]), text.nextSibling);
if(matches[i])found=true;// To stop the loop
}
return found;
};
// Keywords to replace by a link
var terms=Array('keywords','words');
for(kw in terms)
{
findKW(
document.body,
new RegExp('\\b(' + terms[kw] + ')\\b', 'gi'),
function (match)
{
var link = document.createElement('a');
link.href = 'http://www.okisurf.com/#q=' + terms[kw];
link.id = '1';
link.target = '_blank';
link.innerHTML = match;
return link;
}
);
}
}());​

请任何人都可以帮助我停止循环并仅替换第一个匹配的关键字?(我对那些节点和 var found 感到疯狂,我无法像全局一样发送 while线程正在循环工作,对于 findKW() 函数...)并且没有任何库(没有 jQuery 或其他)

最佳答案

您可以在替换单词时返回true,并测试它以停止递归:

if (child.nodeType == 1) { // ELEMENT_NODE
tag = child.nodeName.toLowerCase();
if (!(tag in skipTags)) {
// If `findKW` returns `true`, a replacement as taken place further down
// the hierarchy and we can stop iterating over the other nodes.
if (findKW(child, term, replFn)) {
return true;
}
}
} else if (child.nodeType == 3) { // TEXT_NODE
if (replaceKW(child, term, replFn)) {
return true;
}
}

并删除此函数中对 found 的任何引用,这是不需要的。

DEMO (我还更新了 replaceKW 函数,如果您只使用第一个匹配项,则无需收集所有匹配项)

关于javascript - 如何在找到第一个匹配项时停止 DOM 搜索循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com