文本节点的“nodeValue”属性为空 - 那我该如何测试呢?

Posted

技术标签:

【中文标题】文本节点的“nodeValue”属性为空 - 那我该如何测试呢?【英文标题】:"nodeValue" property of text node is blank - how do I test for it then? 【发布时间】:2011-12-01 03:10:59 【问题描述】:

假设我有一个非常基本的页面,其中包含一个正文、一个 div 和一个带有一些文本的段落元素。

<body>
  <div>
    <p>some text</p>
  <div>
</body>

根据浏览器,body/div 元素会有文本节点(nodeType === 3, nodeValue === "--blank--")。但是,P 元素将具有合法的文本节点,其 nodeValue === "some text"。

我想知道的是代表空白等于的“假”文本节点的“nodeValue”(--blank--)是什么,因为我想编写一个 if 测试,让我过滤掉假文本节点。

例子:

var body = document.getElementsByTagName("body")[0];  // shortcut to body element.
console.log(body.childNodes[0].nodeValue) // maps to one of the fake text nodes that are blank.
// returns a blank line. What is that "blank" equal to? It's not 'null' or "" or undefined...

干杯, 亚历克斯

【问题讨论】:

访问正文的最快方法是作为 documentbody 属性,即document.body。 【参考方案1】:

只需trim()[docs] 空格,看看是否还有剩余:

if( body.childNodes[0].nodeValue.trim() ) 
    // more than white space
 else 
    // just white space

如果只有空格,你最终会得到一个虚假的值。否则就成真了。

文档链接提供以下兼容性填充程序:

if (!String.prototype.trim) 
    String.prototype.trim = function () 
        return this.replace(/^\s+|\s+$/g, '');
    ;

【讨论】:

【参考方案2】:

您可以使用正则表达式,例如:

var re = /\S/; // Match non-whitespace
if (node.nodeType == 3 && re.test(node.nodeValue)) 
  // text node has something other than whitespace

请注意,浏览器认为空格和\s 匹配的内容略有不同,但这在这里可能并不重要。

【讨论】:

以上是关于文本节点的“nodeValue”属性为空 - 那我该如何测试呢?的主要内容,如果未能解决你的问题,请参考以下文章

DOM遍历节点以及属性

揭秘DOM中data和nodeValue属性同步改变那些事

转nodeValue以及其与value的区别以及JS nodeNamenodeValuenodeType返回类型

常用的 HTML DOM 属性是啥

JS-DOM节点属性

DOM下的节点属性和操作小结