2011-05-10 2 views
1

Я работаю над проектом, который выполняет некоторое дерево дерева DOM. Для того, чтобы вставить некоторые пролетных метки, чтобы добавить блики к документу, иногда необходимо разделить TextNode:Тип свойства nodeValue на текстовом узле == «unknown» в IE9

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

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

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

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

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

Благодарю всех за помощь! Пока что моего Google-fu недостаточно.

Сложение:

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

  • длина
  • nodeValue
  • TextContent
  • wholeText
+0

См. Также [Как получить текст текстового узла DOM?] (Http://stackoverflow.com/questions/7690627/how-to-retrieve-the-text-of-a-dom-text-node) – hippietrail

ответ

6

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

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

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

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

if (n < textNode.length) { 
    newTextNode = textNode.splitText(n); 
} 
+0

Я рад получить подтверждение, что я не сумасшедший. Я посмотрю, что здесь происходит, и попробуйте свое предложение! Я просто не верю, что значение splitText 'n' на самом деле является длиной текста в узле, но я проверю. Спасибо за помощь. –

0

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

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

Другие браузеры также не сработают, если вы передадите индекс больше, чем длина текста, чтобы вы могли проверить длину данных узла перед расщеплением.

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

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