Тип свойства nodeValue на текстовом узле == неизвестен в IE9

Я работаю над проектом, который занимается прогулкой по дереву DOM. Чтобы вставить некоторые теги span, чтобы выделить документ, иногда необходимо разделить текстовый узел:

var newTextNode = treeWalker.currentNode.splitText(charOffset);

Проблема в том, что когда я в следующий раз попытаюсь позвонить:

if (newTextNode.nodeValue == "")
{
    //...
}

Этот вызов .nodeValue приводит к ошибке JavaScript в IE9, которая просто говорит: Incorrect function. Совершенно бесполезно, если не сказать больше. Думая, что происходит что-то странное, я открыл отладчик и выполнил: typeof newTextNode.nodeValue, который возвращает "unknown".

Кто-нибудь может объяснить такое поведение? Я подумал, может быть, эта функция просто не применима к текстовым узлам, но в других сценариях она прекрасно работает. Только после звонка splitText кажется, что его тошнит.

Я благодарю всех за помощь! Моего гугл-фу пока недостаточно.

ДОПОЛНЕНИЕ:

После просмотра объекта newTextNode есть больше свойств, которые оцениваются как «Неверная функция».

  • данные
  • длина
  • nodeValue
  • textContent
  • весь текст

person Adam Terlson    schedule 10.05.2011    source источник
comment
См. также Как получить текст узла DOM Text. ?   -  person hippietrail    schedule 05.09.2012


Ответы (2)


Это ошибка в IE 9.

То, что возвращает IE 9, явно не является текстовым узлом. Что это такое, я пока не совсем уверен. Это происходит, когда вы вызываете textNode.splitText(n), где n равно длине текста в текстовом узле. Этого не происходит в IE 7 (невозможно протестировать 8 прямо сейчас) и во всех других основных браузерах, и это противоречит спецификация DOM 2, в которой указано, что splitText()

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

Самым простым решением было бы добавить проверку для этого случая:

if (n < textNode.length) {
    newTextNode = textNode.splitText(n);
}
person Tim Down    schedule 10.05.2011
comment
Я рад получить некоторое подтверждение того, что я не сумасшедший. Я посмотрю, что здесь происходит, и попробую ваше предложение! Только что пришло мне в голову, я не верю, что значение splitText n на самом деле является длиной текста в узле, но я проверю. Спасибо за помощь. - person Adam Terlson; 10.05.2011

IE8 работает правильно, возвращая пустой узел, если вы разделяете текстовый узел по длине его значения. IE9 работает корректно, пока вы не попытаетесь разбить данные по длине.

Я ожидаю, что IE9 (или IE10) сделает это правильно, но у IE6 была та же проблема — он не мог разделить текстовый узел по индексу, если его длина.

Другие браузеры также потерпят неудачу, если вы передадите индекс больше, чем длина текста, поэтому вы можете проверить data.length узла перед разделением.

Если длина меньше или равна индексу, по которому вы хотите разбить, оставьте его в покое и добавьте рядом с ним новый пустой узел.

IE9 (и другие) возвращают пустую строку для данных или nodeValue текстового узла, созданного с помощью пустой строки.

person kennebec    schedule 10.05.2011