Свойство "nodeValue" текстового узла пусто - как мне проверить его?

Допустим, у меня есть очень простая страница с телом, одним 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...

Ура, Алекс

2 ответа

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

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

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

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

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

Если бы было только пустое пространство, вы в конечном итоге с ложным значением. В противном случае это будет правдой.

Ссылка docs обеспечивает следующую совместимость:

if (!String.prototype.trim) {
    String.prototype.trim = function () {
        return this.replace(/^\s+|\s+$/g, '');
    };
}
Другие вопросы по тегам