138 votes

Comment déplacer un élément enfant d'un parent à un autre à l'aide de jQuery

Je suis à l'aide de jQuery DataTables plugin. Je voudrais déplacer la zone de recherche.dataTables_filter) et le nombre d'enregistrements à afficher déroulante (.dataTables_length) à partir de leur élément parent (.dataTables_wrapper) à un autre div sur ma page sans perdre enregistré comportement javascript. Par exemple, la zone de recherche a une fonction attachée à l' 'keyup' événement et je veux le garder intact.

Le DOM ressemble à ceci:

<body>
<div id="parent1">
  <div class="dataTables_wrapper" id="table1_wrapper">
    <div class="dataTables_length" id="table1_length">
      <select size="1" name="table1_length">
        <option value="10">10</option>
        <option value="25">25</option>
        <option value="50">50</option>
        <option value="100">100</option>
      </select>
    </div>
    <div class="dataTables_filter" id="table1_filter">
      <input type="text" class="search">
    </div>
    <table id="table1">
    ...
    </table>
  </div>
</div>
<div id="parent2">
  <ul>
    <li><a href="#">Link A</a></li>
    <li><a href="#">Link B</a></li>
    <li><a href="#">Link C</a></li>
  </ul>
</div>
</body>

C'est ce que j'aimerais que le DOM pour ressembler après le déménagement:

<body>
<div id="parent1">
  <div class="dataTables_wrapper" id="table1_wrapper">
    <table id="table1">
    ...
    </table>
  </div>
</div>
<div id="parent2">
  <div class="dataTables_filter" id="table1_filter">
    <input type="text" class="search">
  </div>
  <div class="dataTables_length" id="table1_length">
    <select size="1" name="table1_length">
      <option value="10">10</option>
      <option value="25">25</option>
      <option value="50">50</option>
      <option value="100">100</option>
    </select>
  </div>
  <ul>
    <li><a href="#">Link A</a></li>
    <li><a href="#">Link B</a></li>
    <li><a href="#">Link C</a></li>
  </ul>
</div>
</body>

J'ai été à la recherche à la .append(), .appendTo(), .prepend() et .prependTo() fonctionne mais je n'ai pas eu de chance avec ces dans la pratique. J'ai aussi regardé le .parent() et .les parents() fonctionne, mais ne semble pas possible de coder une solution viable. J'ai également envisagé de remplacer le CSS de sorte que les éléments sont en position absolue - mais pour être franc, la page de configuration avec le fluide éléments de tous les cours, et j'ai vraiment envie que ces éléments soient flottait dans leurs nouveaux parents.

Tout, est très apprécié.

306voto

eric.itzhak Points 5261

Comme la réponse de Jage supprime complètement l'élément, y compris les gestionnaires d'événements et les données, j'ajoute une solution simple qui ne le fait pas, grâce à la fonction detach .

 var element = $('#childNode').detach();
$('#parentNode').append(element);
 

158voto

JackArbiter Points 1892

Detach est inutile.

La réponse (2013) est simple:

$('#parentNode').append($('#childNode'));

Selon http://api.jquery.com/append/

Vous pouvez également sélectionner un élément sur la page, et l'insérer dans une autre:

$('.container').append($('h2'));

Si un élément choisi cette voie est inséré dans un emplacement unique d'ailleurs dans les DOM, il sera déplacé dans la cible (pas cloné).

40voto

Alex Lawford Points 337

$('#parent2').prepend($('#table1_length')).prepend($('#table1_filter'));

ça ne marche pas pour toi? Je pense que ça devrait ...

35voto

Jage Points 4889

Sur la base des réponses fournies, j'ai décidé de créer un plugin rapide pour le faire:

 (function($){
    $.fn.moveTo = function(selector){
        return this.each(function(){
            var cl = $(this).clone();
            $(cl).appendTo(selector);
            $(this).remove();
        });
    };
})(jQuery);
 

Usage:

 $('#nodeToMove').moveTo('#newParent');
 

-6voto

Ben Points 6731

Essaye ça:

 var kids = $('#table1_wrapper').children();
$.each(kids, function(){
    $('#table1_wrapper').remove($(this));
    $('#anotherdiv').append($(this));
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X