如何使用jQuery将子元素从一个父元素移动到另一个父元素

时间:2010-04-08 00:33:53

标签: jquery jquery-plugins

我正在使用jQuery DataTables插件。我想将搜索框(.dataTables_filter)和记录数从其父元素(.dataTables_wrapper)显示下拉列表(.dataTables_length)到我页面上的另一个div而不会丢失任何已注册的javascript行为。例如,搜索框有一个附加到'keyup'事件的函数,我希望保持完整。

DOM看起来像这样:

<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>

这就是我希望移动后DOM看起来像:

<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>

我一直在查看.append(),. appendTo(),. prepend()和.prependTo()函数,但在实践中没有任何运气。我还查看了.parent()和.parents()函数,但似乎无法编写可行的解决方案。我也考虑过改变CSS以便元素绝对定位 - 但坦率地说,页面设置了流畅的元素,我真的希望这些元素能够在他们的新父母中浮动。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:287)

由于Jage的回答完全删除了元素,包括事件处理程序和数据,我正在添加一个不能做到这一点的简单解决方案,这要归功于detach函数。

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

修改

Igor Mukhin在下面的评论中提出了一个更短的版本:

$("#childNode").detach().appendTo("#parentNode");

答案 1 :(得分:153)

Detach是不必要的。

答案(截至2013年)很简单:

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

根据http://api.jquery.com/append/

  

您还可以在页面上选择一个元素并将其插入另一个元素:

     。

$(”。容器 ')附加($(' H2' ));

     

如果以这种方式选择的元素插入到单个位置   在DOM的其他地方,它将被移动到目标(未克隆)。

答案 2 :(得分:37)

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

不适合你吗?我认为应该......

答案 3 :(得分:33)

根据提供的答案,我决定制作一个快速插件来执行此操作:

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

用法:

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