检查 HTML 元素是否包含原始文本?

she*_*nan 5 html javascript dom

采取这个 HTML:

<div id="el1">
  <div id="el2">
    <div id="el3">
      Hello
      <div id="el4">
        World
      </div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

注意el3el4包含原始文本;即“你好”和“世界”。其他元素(el1el2)仅包含其他元素。

然而,使用纯 JavaScript,它们的所有innerHTML属性都表明它们包含某种形式的文本。

如何使用纯 JavaScript 来确定特定元素是否包含原始文本作为子元素。在这种情况下,该方法还将识别el3为包含原始文本(即使此后它还包含另一个元素)。

像这样的东西:

var els = getElementByTagName("*");

for(var i = 0; i < els.length; i++){

  if( /* element contains text */ ){

    // do something

  }
}
Run Code Online (Sandbox Code Playgroud)

这真的只是 RegEx 的工作吗?有了 HTMLElement 的所有属性,您可能会认为会有更好的方法。

没有 jQuery,谢谢。

ade*_*neo 2

innerHTML 获取 HTML,并且除了最后一个元素之外的所有元素都包含 HTML,因为它们是嵌套的。

例如,innerHTML#el2

  <div id="el3">
      Hello
      <div id="el4">
          World
      </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

为了仅获取文本,现代浏览器支持innerTexttextContent(firefox)。
然后是空格,所以你可能也应该修剪()文本,所以像这样

var els = document.querySelectorAll("#wrapper *");

for(var i = 0; i < els.length; i++){
    var el = els[i].cloneNode(true);
    var children = el.children;

    for (var j=children.length; j--;) el.removeChild(children[j]);
    var content = el.innerText ? el.innerText  : el.textContent;

    if( content.trim().length ){
        // do something
        console.log(els[i].getAttribute('id') + ' has text');
    }
}
Run Code Online (Sandbox Code Playgroud)

小提琴

或者检查文本节点的nodeType和nodeValue

var els = document.querySelectorAll("#wrapper *");

for(var i = 0; i < els.length; i++){
    var el = els[i];
    var children = el.childNodes;

    for (var j=children.length; j--;) {
        if( children[j].nodeType === 3 && children[j].nodeValue.trim().length) {
            // do something
            console.log(els[i].getAttribute('id') + ' has text');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小提琴