如何将元素移动到另一个元素?

Mar*_*man 1611 html javascript jquery

我想将一个DIV元素移到另一个元素中.例如,我想移动它(包括所有孩子):

<div id="source">
...
</div>
Run Code Online (Sandbox Code Playgroud)

进入这个:

<div id="destination">
...
</div>
Run Code Online (Sandbox Code Playgroud)

所以我有这个:

<div id="destination">
  <div id="source">
    ...
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

And*_*are 1744

您可能想要使用该appendTo函数(添加到元素的末尾):

$("#source").appendTo("#destination");
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用该prependTo函数(添加到元素的开头):

$("#source").prependTo("#destination");
Run Code Online (Sandbox Code Playgroud)

例:

$("#appendTo").click(function() {
  $("#moveMeIntoMain").appendTo($("#main"));
});
$("#prependTo").click(function() {
  $("#moveMeIntoMain").prependTo($("#main"));
});
Run Code Online (Sandbox Code Playgroud)
#main {
  border: 2px solid blue;
  min-height: 100px;
}

.moveMeIntoMain {
  border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">main</div>
<div id="moveMeIntoMain" class="moveMeIntoMain">move me to main</div>

<button id="appendTo">appendTo main</button>
<button id="prependTo">prependTo main</button>
Run Code Online (Sandbox Code Playgroud)

  • 这是一篇关于在jQuery中删除,替换和移动元素的优秀文章:http://www.elated.com/articles/jquery-removing-replacing-moving-elements/ (50认同)
  • 注意appendTo的jQuery文档声明元素被移动:`它将被移动到目标(未克隆)并返回由插入元素组成的新集合 - http://api.jquery.com/appendto/ (39认同)
  • appenTo创建一个副本或实际上将整个div移动到目的地?(因为如果它复制,它会在通过id调用div时创建错误) (30认同)
  • 警告这可能无法在jQuery mobile中正常工作,因为它可能会创建该元素的另一个副本. (22认同)
  • 你没有移动它,只是附加.下面的答案做了正确的MOVE. (15认同)
  • 该文档还说:"但是,如果有多个目标元素,则会在第一个目标元素之后为每个目标创建插入元素的克隆副本,并返回该新集合(原始元素加克隆)." 所以在一般情况下,这个解决方案可以创建副本! (7认同)
  • 在jQuery Mobile中为我工作.谢谢! (4认同)
  • 这份副本.不动.@Alejandro Illecas的回答动作. (4认同)
  • 这个动作,不复制.请参阅John K上面列出的实际文档,而不是随机发布错误评论的人. (2认同)

小智 869

我的解决方案

移动:

jQuery("#NodesToMove").detach().appendTo('#DestinationContainerNode')
Run Code Online (Sandbox Code Playgroud)

复制:

jQuery("#NodesToMove").appendTo('#DestinationContainerNode')
Run Code Online (Sandbox Code Playgroud)

注意.detach()的用法.复制时,请注意不要复制ID.

  • 对不起,但Andrew Hare接受的答案是正确的 - 分离是不必要的.在上面的Pixic的JSFiddle中尝试它 - 如果你删除分离调用它完全相同,即它移动,而不是副本.这是一个只有一个变化的分支:http://jsfiddle.net/D46y5/如API中所述:https://api.jquery.com/appendTo/:"如果以这种方式选择的元素插入到单个中在DOM的其他位置,它将被移动到目标(未克隆)中,并返回由插入元素组成的新集合" (95认同)
  • 最佳答案.接受的答案创建副本,不会像问题那样移动元素. (84认同)
  • appendTo文档还说:"但是,如果有多个目标元素,则会在第一个目标元素之后为每个目标创建插入元素的克隆副本,并返回该新集合(原始元素加克隆)." 所以在一般情况下,这个解决方案也可以创建副本! (10认同)
  • @ John-Notanumber是对的 - 这里不需要detach().接受的答案是最好的,您只需要正确阅读文档. (8认同)

kjc*_*ter 106

我刚用过:

$('#source').prependTo('#destination');
Run Code Online (Sandbox Code Playgroud)

我从这里抓住.

  • 好吧,当您想要保留元素并稍后重新插入时,分离很有用,但在您的示例中,无论如何都会立即重新插入. (6认同)
  • 恐怕我不太明白你在说什么,你能提供示例代码吗? (2认同)
  • 我的意思是,prependTo,将元素从其原始位置分离,并将其插入到新位置。另一方面,分离功能只是分离所选元素,您可以将其保存在一个变量中,以便稍后将其插入到 DOM 中。问题是,您的 detach 调用是不必要的。删除它,您将获得相同的效果。 (2认同)
  • 令人难以置信的是,编辑完全改变了这个答案,以至于一年后添加了另一个答案(与原始答案相同)并获得了 800 多个赞成票...... (2认同)

its*_*sme 93

如果div要放置元素的位置包含内容,并且您希望元素显示主要内容之后:

  $("#destination").append($("#source"));
Run Code Online (Sandbox Code Playgroud)

如果div要放置元素的位置包含内容,并且要在主要内容之前显示元素:

$("#destination").prepend($("#source"));
Run Code Online (Sandbox Code Playgroud)

如果div要放置元素的位置为空,或者您想要完全替换它:

$("#element").html('<div id="source">...</div>');
Run Code Online (Sandbox Code Playgroud)

如果要在上述任何一个之前复制元素:

$("#destination").append($("#source").clone());
// etc.
Run Code Online (Sandbox Code Playgroud)


Ali*_*sam 86

怎么样一个JavaScript的解决方案吗?

声明一个片段:

var fragment = document.createDocumentFragment();

将所需元素附加到片段:

fragment.appendChild(document.getElementById('source'));

将片段附加到所需元素:

document.getElementById('destination').appendChild(fragment);

看看这个.

  • 为什么使用createDocumentFragment而不仅仅是document.getElementById('destination').appendChild(document.getElementById('source'))? (7认同)
  • @ GunarC.Gessner假设您需要在将源对象添加到目标对象之前修改源对象,那么最好的方法是使用片段作为虚构对象并且不是DOM树的一部分,在修改时会获得更好的性能源对象从它的原始位置(现在它在片段内)转换后,而不是在附加它之前在它的初始位置修改它. (6认同)
  • 我想补充一下提供JavaScript纯解决方案的相关性.不应该假设jQuery总是被使用 (5认同)

小智 29

您可以使用:

要插入之后,

jQuery("#source").insertAfter("#destination");
Run Code Online (Sandbox Code Playgroud)

要插入另一个元素,

jQuery("#source").appendTo("#destination");
Run Code Online (Sandbox Code Playgroud)


Bek*_*caj 24

曾经尝试过简单的JavaScript ...... destination.appendChild(source);

onclick = function(){ destination.appendChild(source); }
Run Code Online (Sandbox Code Playgroud)
div{ margin: .1em; } 
#destination{ border: solid 1px red; }
#source {border: solid 1px gray; }
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>

 <body>

  <div id="destination">
   ###
  </div>
  <div id="source">
   ***
  </div>

 </body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,到了 2020 年,人们越来越多地使用 javascript,却仍然吹嘘 jQuery 是一个你不需要的“大”库。 (20认同)
  • 令人惊讶的是人们仍然认为jQuery等于JavaScript.真的,2017年不再需要jQuery了. (6认同)
  • 2017 年不需要 jquery,但有时使用更轻量且类似的东西来完成您在每个项目中一遍又一遍地执行的任务会有所帮助。我使用 cash-dom 作为一种简单的方法来以跨浏览器友好的方式监听 document.ready、window.load 事件。十分简单。 (6认同)
  • 现在已经是 2020 年了,将其更改为已接受的答案:) (6认同)
  • 令人惊讶的是,人们仍然认为 jQuery 等于 JavaScript。2020 年不再需要 jQuery,真的。 (3认同)
  • _“编辑对于保持帖子清晰、相关和最新非常重要。如果您对由其他可信用户协作编辑您的贡献的想法不满意,那么这个网站可能不适合您。”_ — 来自[帮助中心](/help/editing)。 (2认同)

小智 18

如果您想要快速演示以及有关如何移动元素的更多详细信息,请尝试以下链接:

http://html-tuts.com/move-div-in-another-div-with-jquery


这是一个简短的例子:

要移动一个元素:

$('.whatToMove').insertBefore('.whereToMove');
Run Code Online (Sandbox Code Playgroud)

要移动一个元素:

$('.whatToMove').insertAfter('.whereToMove');
Run Code Online (Sandbox Code Playgroud)

要在元素内移动,请在该容器内ABOVE ALL元素:

$('.whatToMove').prependTo('.whereToMove');
Run Code Online (Sandbox Code Playgroud)

要在元素内移动,请在该容器内的所有元素之后:

$('.whatToMove').appendTo('.whereToMove');
Run Code Online (Sandbox Code Playgroud)


Sub*_*axe 16

您可以使用以下代码将源移动到目标

 jQuery("#source")
       .detach()
       .appendTo('#destination');
Run Code Online (Sandbox Code Playgroud)

尝试工作codepen

function move() {
 jQuery("#source")
   .detach()
   .appendTo('#destination');
}
Run Code Online (Sandbox Code Playgroud)
#source{
  background-color:red;
  color: #ffffff;
  display:inline-block;
  padding:35px;
}
#destination{
  background-color:blue;
  color: #ffffff;
  display:inline-block;
  padding:50px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="source">
I am source
</div>

<div id="destination">
I am destination
</div>

<button onclick="move();">Move</button>
Run Code Online (Sandbox Code Playgroud)


HMR*_*HMR 10

老问题但是到了这里因为我需要将内容从一个容器移动到另一个容器,包括所有事件监听器.

jQuery没有办法做到这一点,但标准DOM函数appendChild做到了.

//assuming only one .source and one .target
$('.source').on('click',function(){console.log('I am clicked');});
$('.target')[0].appendChild($('.source')[0]);
Run Code Online (Sandbox Code Playgroud)

使用的appendChild删除.source并将其放入目标,包括它的事件侦听器:https://developer.mozilla.org/en-US/docs/Web/API/Node.appendChild


spe*_*naz 6

我注意到insertAfter&after或之间存在巨大的内存泄漏和性能差异insertBefore&before。如果你有大量的 DOM 元素,或者你需要使用after()before()MouseMove 事件中,浏览器内存可能会增加,接下来的操作会运行得很慢。

我刚刚遇到的解决方案是使用 inserBeforebefore()和 insertAfter 代替after()


Kam*_*ski 6

Bekim Bacaj 答案的脏尺寸改进:

div { border: 1px solid ; margin: 5px }
Run Code Online (Sandbox Code Playgroud)
<div id="source" onclick="destination.appendChild(this)">click me</div>
<div id="destination" >...</div>
Run Code Online (Sandbox Code Playgroud)


Tam*_*mas 5

您也可以尝试:

$("#destination").html($("#source"))
Run Code Online (Sandbox Code Playgroud)

但这将完全覆盖你所拥有的任何东西#destination.

  • 并在已移动的元素上中断事件侦听器。 (2认同)

Ali*_*eza 5

您可以使用纯 JavaScript,使用appendChild()方法...

appendChild() 方法附加一个节点作为节点的最后一个子节点。

提示:如果要创建带有文本的新段落,请记住将文本创建为附加到段落的文本节点,然后将段落附加到文档。

您还可以使用此方法将元素从一个元素移动到另一个元素。

提示:使用 insertBefore() 方法在指定的现有子节点之前插入新的子节点。

所以你可以这样做来完成这项工作,这是我为你创建的,使用appendChild(),运行并查看它如何适用于你的情况:

function appendIt() {
  var source = document.getElementById("source");
  document.getElementById("destination").appendChild(source);
}
Run Code Online (Sandbox Code Playgroud)
#source {
  color: white;
  background: green;
  padding: 4px 8px;
}

#destination {
  color: white;
  background: red;
  padding: 4px 8px;
}

button {
  margin-top: 20px;
}
Run Code Online (Sandbox Code Playgroud)
<div id="source">
  <p>Source</p>
</div>

<div id="destination">
  <p>Destination</p>
</div>

<button onclick="appendIt()">Move Element</button>
Run Code Online (Sandbox Code Playgroud)