在整个DOM中搜索数字

时间:2018-05-16 09:59:41

标签: javascript

我需要在整个文档中搜索电话号码,并编制一个包含此电话号码的元素列表。

但是我遇到了一些障碍。

  1. 我不能简单地执行document.body.innerHTML并替换这些数字,因为这会弄乱第三方脚本。

  2. 以下内容将匹配这些元素,但只有在它们中包含数字时才会匹配,而不是其他内容:

    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标记。

  3. 使用textContent代替text也不起作用,因为元素的父级将匹配,但我不想要父级。

  4. 修改:

    <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级以上的父级。

1 个答案:

答案 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);
}