2010-07-28 17 views
12

tengo HTML como la siguiente:Usar JavaScript insertBefore() para insertar antes de un TextNode?

<div id="move-me"> 
    <a href="#">I'm a link</a> 
</div> 

<div id="new-parent"> 
    Some plain text. 
</div> 

Estoy intentando escribir JavaScript que mover todo el movimiento #-me div dentro de la div # new-matriz, por encima de el texto, así:

<div id="new-parent"> 
    <div id="move-me"> 
     <a href="#">I'm a link</a> 
    </div> 
    Some plain text. 
</div> 

Aquí está el código JavaScript que tengo:

function moveDiv() { 
    var moveable = document.getElementById('move-me'); 
    var newParent = document.getElementById('new-parent'); 
    newParent.parentNode.insertBefore(moveable, newParent.firstChild); 
} 

estoy usando Firebug para depurar, y puedo ver que newParent.firstChild es un textNode, pero siempre recibir el siguiente error:

Node was not found" code: "8 
newParent.parentNode.insertBefore(moveable, newParent.firstChild); 

Parece que insertBefore requiere un nodo elemento y no funcionarán en un nodo de texto ... es así? Si es así, ¿hay otro buen método para hacer esto?

Nota: No puedo modificar o limpiar el HTML para incluir etiquetas de párrafo o eliminar el espacio en blanco.

Respuesta

13

No, insertBefore funcionará bien con un nodo de texto como el nodo que se va a insertar antes. El problema es que el nodo que está intentando insertar antes no es un elemento secundario del nodo en el que está insertando. Es necesario eliminar el bit .parentNode:

newParent.insertBefore(moveable, newParent.firstChild); 
+0

Gracias, gracias. Tu explicación ayuda mucho; También lo he mezclado en appendChild, creo. –

+0

Veo - Insertar Antes debe invocarse en el contenedor/nodo padre que contiene el nodo que deseo insertar antes. – kermit

2

tiene que quitar el ".parentNode" de su instrucción de inserción. Un nodo de texto sigue siendo un nodo y se puede referenciar como cualquier otro nodo.

Cuestiones relacionadas