Tipo de propiedad "nodeValue" en el nodo de texto == "desconocido" en IE9

Estoy trabajando en un proyecto que está caminando por un árbol DOM. Para insertar algunas etiquetas de intervalo para agregar aspectos destacados a un documento, a veces es necesario dividir un nodo de texto:

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

El problema es la próxima vez que intente llamar:

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

Este patrón de .nodeValue llamada produce un error de JavaScript en IE9 que dice simplemente, Incorrect function. Totalmente inútil por decir lo mínimo. Pensando que tal vez estaba pasando algo extraño, abrí el depurador y ejecuté: typeof newTextNode.nodeValue que regresa "unknown".

¿Alguien puede explicar este comportamiento? Pensé que tal vez esa función simplemente no se aplica a los nodos de texto, pero funciona bien en otros escenarios. Es solo después de llamar splitText que parece vomitar.

¡Les agradezco a todos por su ayuda! Mi Google-fu ha sido hasta ahora insuficiente.

ADICIÓN:

Después de mirar el objeto newTextNode, hay más propiedades que se evalúan como "Función incorrecta"

  • datos
  • de largo
  • nodeValue
  • contenido del texto
  • texto completo

preguntado el 10 de mayo de 11 a las 13:05

2 Respuestas

Este es un error en IE 9.

Lo que IE 9 está devolviendo claramente no es un nodo de texto. Todavía no estoy muy seguro de qué es. Pasa cuando llamas textNode.splitText(n) dónde n es igual a la longitud del texto en el nodo de texto. Esto no sucede en IE 7 (no se puede probar 8 en este momento) y en todos los demás navegadores principales, y es contrario a la Especificaciones DOM 2, el cual establece que splitText()

Divide este nodo en dos nodos en el desplazamiento especificado, manteniendo a ambos en el árbol como hermanos. Después de dividirse, este nodo contendrá todo el contenido hasta el punto de compensación. Se devuelve un nuevo nodo del mismo tipo, que contiene todo el contenido en y después del punto de desplazamiento. Si el nodo original tenía un nodo padre, el nuevo nodo se inserta como el siguiente hermano del nodo original. Cuando el desplazamiento es igual a la longitud de este nodo, el nuevo nodo no tiene datos.

La solución más sencilla sería agregar un cheque para este caso:

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

contestado el 10 de mayo de 11 a las 19:05

Estoy feliz de tener alguna validación de que no estoy loco. ¡Veré lo que está pasando aquí y probaré tu sugerencia! Justo en la parte superior de mi cabeza, no creo en el texto dividido n value es en realidad la longitud del texto en el nodo, pero lo verificaré. Gracias por la ayuda. - Adam Terlson

IE8 funciona correctamente, devolviendo un nodo vacío si divide un nodo de texto en la longitud de su valor. IE9 funciona correctamente hasta que intente dividir la longitud de los datos.

Espero que IE9 (o IE10) lo haga bien, pero IE6 tenía el mismo problema: no podría dividir un nodo de texto en un índice tan largo como su longitud.

Los otros navegadores también fallarán si pasa un índice mayor que la longitud del texto, por lo que podría comprobar la longitud de datos del nodo antes de dividir.

Si la longitud es menor o igual que el índice en el que desea dividir, déjelo y agregue un nuevo nodo vacío junto a él.

IE9 (y los demás) devuelven una cadena vacía para los datos o nodeValue de un nodo de texto creado con una cadena vacía.

contestado el 10 de mayo de 11 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.