我需要在整个文档中搜索电话号码,并编制一个包含此电话号码的元素列表。
但是我遇到了一些障碍。
我不能简单地执行document.body.innerHTML
并替换这些数字,因为这会弄乱第三方脚本。
以下内容将匹配这些元素,但只有在它们中包含数字时才会匹配,而不是其他内容:
let elements = document.querySelectorAll("a, div, p, li");
let found = [];
for (let elm in elements) {
if (elements.hasOwnProperty(elm)) {
if (elements[elm].textContent !== undefined && elements[elm].textContent.search("00000 000000") != -1) {
found.push(elements[elm]);
}
}
}
因此以下元素不匹配:
<li class="footer__telephone">
<i class="fa fa-phone" aria-hidden="true"></i>00000 000000
</li>
由于其中包含i
标记。
使用textContent
代替text
也不起作用,因为元素的父级将匹配,但我不想要父级。
修改:
<div class="row-block hmpg-text">
<div class="wrapper">
<div class="container">
<div class="row">
<div class="twelvecol">
00000 000000
</div>
</div>
</div>
</div>
</div>
让我们说上面是我的HTML,如果我遍历所有元素并用testContent
测试它们然后第一个将返回为true,包含我的数字,但是我需要带有其上的twelvecol
类,而不是4级以上的父级。
答案 0 :(得分:0)
管理找到一个答案,类似于Phylogenesis所说的但却无法让任何一个例子起作用。
function replaceText(el, regex_display, regex_link) {
// Replace any links
if (el.tagName === "A") {
if (regex_link.test(el.getAttribute("href"))) {
el.setAttribute("href", el.getAttribute("href").replace(regex_link, replacement.replace(/\s/g, '')));
}
}
if (el.nodeType === 3) {
if (regex_display.test(el.data)) el.data = el.data.replace(regex_display, replacement);
if (regex_link.test(el.data)) el.data = el.data.replace(regex_link, replacement);
} else {
let children = el.childNodes;
for (let i = 0; i < children.length; i++) {
replaceText(children[i], regex_display, regex_link);
}
}
}
let bodyChildren = document.body.childNodes;
let search_display = new RegExp(search, "g");
let search_link = new RegExp(search.replace(/\s/g, ''), "g");
for (let i = 0; i < bodyChildren.length; i++) {
replaceText(bodyChildren[i], search_display, search_link);
}