Тип свойства "nodeValue" в текстовом узле == "unknown" в IE9 - PullRequest
1 голос
/ 10 мая 2011

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

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

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

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

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

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

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

ДОПОЛНЕНИЕ:

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

  • data
  • length
  • nodeValue
  • textContent
  • wholeText

Ответы [ 2 ]

6 голосов
/ 10 мая 2011

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

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

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

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

if (n < textNode.length) {
    newTextNode = textNode.splitText(n);
}
0 голосов
/ 10 мая 2011

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

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

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

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

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

...