2011-06-13 2 views
8

Dans un Javascript compatible avec le prototype ou le normal-mais-cross-browser, comment déplacer le contenu d'une div vers le contenu d'une autre div?Déplacement d'un div de l'intérieur d'un div à un autre div en utilisant Prototype?

A l'intérieur de la div est une forme avec des identifiants et un code Javascript dépendant avec des observateurs d'événements. Je ne veux pas que ça casse juste parce que j'ai déplacé un bloc dans le DOM. Une solution 'innerHTML = that innerHTML' n'est pas ce que je cherche. Je vais aussi avoir besoin de faire cela lorsque le DOM est chargé.

Je veux aller de ceci:

<div id='here'> 
    <div id='MacGuffin'> 
    <p>Hello Worlds!</p> 
    </div> 
</div> 
<div id='there'> 
</div> 

à ceci:

<div id='here'> 
</div> 
<div id='there'> 
    <div id='MacGuffin'> 
    <p>Hello Worlds!</p> 
    </div> 
</div> 

... lorsque les charges de documents avec rien sautant.

Répondre

33

Vous pouvez ajouter cela à la fin de la balise BODY:

<script> 
    document.getElementById('there').appendChild(
    document.getElementById('MacGuffin') 
); 
</script> 

MacGuffin seront déplacés automatiquement de l'un à l'autre.
Et il n'y aura pas de scintillement.

+0

Merci beaucoup. J'ai bien travaillé même si je n'ai pas choisi la balise BODY, mais j'ai opté pour le prototype sur la méthode de chargement DOM. –

+1

Glad cela a fonctionné. Je ne connais pas bien le prototype, mais si je me souviens bien, $ ('there'). AppendChild ($ ('MacGuffin')) 'pourrait aussi fonctionner. – Mic

+0

c'est vraiment génial, beaucoup mieux que des trucs css sales –

1

Pour déplacer le contenu de here dans there, vous êtes essentiellement après:

$('there').insert($('here').childNodes); 

Malheureusement, cela ne fonctionne pas.

Comme pour les deux autres réponses, il semble que vous deviez recourir à du JavaScript simple avec un prototype fournissant seulement un raccourci pour document.getElementById.

var frag = document.createDocumentFragment(); 
for (var c = $('nav').firstChild, n; c; c = n) { 
    n = c.nextSibling; 
    frag.appendChild(c); 
} 
$('header').appendChild(frag); 

(Voir John Démission du blog pour les statistiques de performance sur DocumentFragments: http://ejohn.org/blog/dom-documentfragments/)

+0

Merci d'avoir examiné cela pour moi.Je n'ai pas pu utiliser la sténographie $ mais la suggestion de Mic a bien fonctionné. J'ai été capable d'utiliser Prototype pour exécuter le déplacement sur la charge DOM, mais j'ai été surpris qu'il n'y avait pas de solution Prototype. –

1

Pour déplacer le contenu de here dans there, cela fonctionne, tant que here enserre tout ce que vous voulez déplacer, comme un <div>:

$('there').insert($('here').descendants()[0]); 

descendants() retourne un tableau, et l'insert prend le contenu, afin d'utiliser la premier élément.

2

Peut-être pas un point majeur, mais il n'y a pas de méthode d'interface Javascript intégrée de Node.migrateChild(). Si un fragment a déjà un parent ailleurs dans le DOM (comme div id = 'MacGuffin' le fait dans le balisage d'exemple ci-dessus), appendChild() détache tranquillement le fragment d'argument de tout parent courant avant de le rattacher au nouveau parent. Dans mon esprit migrateChild() serait un nom de méthode significativement sémantiquement plus que appendChild(), moins besoin de recherches de développeur StackOverflow pour faire allusion à ses capacités plus puissantes.

+0

https://developer.mozilla.org/fr-fr/docs/Web/API – rickatech

Questions connexes