2010-07-28 4 views
12

Je HTML comme ce qui suit:Utilisation de JavaScript insertBefore() pour insérer avant un TextNode?

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

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

Je suis en train d'écrire JavaScript qui se déplacera toute la # move-moi div à l'intérieur du div # nouveau parent, ci-dessus le texte, comme suit:

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

Voici le JavaScript je:

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

J'utilise Firebug pour déboguer, et je peux voir que newParent.firstChild est un TextNode, mais je reçois toujours l'erreur suivante:

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

Il semble que insertBefore nécessite un nœud d'élément et ne fonctionnera pas sur un nœud de texte ... est-ce pas? Si oui, y a-t-il une autre bonne méthode pour le faire?

Remarque: Je ne peux pas modifier ou nettoyer le code HTML pour inclure des balises de paragraphe ou supprimer des espaces.

Répondre

13

Non, insertBefore fonctionnera correctement avec un noeud de texte en tant que noeud à insérer avant. Le problème est que le nœud que vous essayez d'insérer n'est pas un enfant du nœud auquel vous insérez. Vous devez supprimer le bit .parentNode:

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

Merci, merci. Votre explication aide beaucoup; J'ai aussi mélangé ça avec appendChild, je pense. –

+0

Je vois - insertBefore doit être appelé sur le conteneur/parent qui contient le noeud que je veux insérer avant. – kermit

2

Vous devez supprimer le « .parentNode » de votre déclaration d'insertion. Un nœud de texte est toujours un nœud et peut être référencé comme tous les autres nœuds.

Questions connexes