Свойство "nodeValue" текстового узла пусто - как мне проверить его? - PullRequest
0 голосов
/ 05 октября 2011

Итак, скажем, у меня есть очень простая страница с телом, одним div и элементом абзаца внутри с некоторым текстом.

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

В зависимости от браузера, элементы body / div будут иметь текстовые узлы (nodeType === 3, nodeValue === "--blank--"). Однако элемент P будет иметь допустимый текстовый узел с nodeValue === "некоторый текст".

Что меня интересует, так это что такое "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...

Cheers, Alex

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Вы можете использовать регулярное выражение, такое как:

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

отмечая, что существуют небольшие различия в том, что браузеры считают пробелами и что соответствует \s, но это может быть не важно здесь.

2 голосов
/ 05 октября 2011

Просто trim() [документы] пробел и посмотрите, осталось ли что-нибудь:

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, '');
    };
}
...