我试图找出是否有可能用锚标记包装字符串的所有实例。基本上,我们想在我们的网站上找到myBrand或的任何实例,myBrand.com并将它们包装在锚点中,例如<a href="/">myBrand</a>或<a href="/">myBrand.com</a>。但是,无论它们在我页面的各个元素中的埋深有多深,我都希望能够找到此实例的所有实例,并查看它们是否已链接,这就是我遇到的问题。编辑我已将代码段编辑为现在的内容,但仍然遇到困难:document.querySelectorAll('body').forEach(function(el){ var text = el.innerHTML.match(/myBrand/g); console.log(text.parentElement); // how do i get the parent? if(isAnchor(text.parentElement)){ // }else{ var newtext = el.innerHTML.replace(/myBrand/g, '<a href="/">myBrand</a>'); el.innerHTML = newtext; }});function isAnchor(str){ return /^\<a.*\>.*\<\/a\>/i.test(str);}<body>myBrand<h1>myBrand.com</h1><p>This is a div that mentions myBrand</p><table><thead> <tr> <td>This is myBrand's table header</td> </tr></thead><tbody> <tr> <td>myBrand.com</td> </tr></tbody></table><a href="/">myBrand.com</a></body>
3 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
您可以为此使用XPath:
function textContaining(phrase) {
return document.evaluate(
"//text()[contains(., '" + phrase + "')]",
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
)
}
然后,您可以像这样遍历结果:
var result = textContaining(phrase)
for (var i = 0; i < result.snapshotLength; ++i) {
var originalNode = result.snapshotItem(i)
// ...
}
一旦获得了匹配#text节点的列表,您只需要过滤掉任何.parentElement是<a>标签的节点即可。
另外,您可以使用jQuery.parents()函数检查父母的父母,以便解决诸如之类的情况<a><span>sometext</span></a>,而不仅仅是直接子女的情况。
添加回答
举报
0/150
提交
取消