我想将一个 DIV 元素移动到另一个元素中。例如,我想移动这个(包括所有孩子):
<div id="source">
...
</div>
进入这个:
<div id="destination">
...
</div>
所以我有这个:
<div id="destination">
<div id="source">
...
</div>
</div>
您可能想要使用 appendTo
函数(添加到元素的末尾):
$("#source").appendTo("#destination");
或者,您可以使用 prependTo
函数(添加到元素的开头):
$("#source").prependTo("#destination");
例子:
$("#appendTo").click(function() { $("#moveMeIntoMain").appendTo($("#main")); }); $("#prependTo").click(function() { $("#moveMeIntoMain").prependTo($("#main")); }); #main { 边框:2px 纯蓝色;最小高度:100px; } .moveMeIntoMain { 边框:1px 纯红色; }
我的解决方案:
移动:
jQuery("#NodesToMove").detach().appendTo('#DestinationContainerNode')
复制:
jQuery("#NodesToMove").appendTo('#DestinationContainerNode')
注意 .detach() 的用法。复制时,请注意不要复制 ID。
JavaScript 解决方案怎么样?
// Declare a fragment:
var fragment = document.createDocumentFragment();
// Append desired element to the fragment:
fragment.appendChild(document.getElementById('source'));
// Append fragment to desired element:
document.getElementById('destination').appendChild(fragment);
我刚用过:
$('#source').prependTo('#destination');
我从 here 中获取的。
曾经尝试过纯 JavaScript...destination.appendChild(source);
吗?
onclick = function(){destination.appendChild(source); } div{ 边距:.1em; } #destination{ 边框:实心 1px 红色; } #source {border:solid 1px gray; }
如果您要放置元素的 div
内部有内容,并且您希望元素在主要内容之后显示:
$("#destination").append($("#source"));
如果您想要放置元素的 div
里面有内容,并且您想要在 之前 显示元素的主要内容:
$("#destination").prepend($("#source"));
如果您想要放置元素的 div
为空,或者您想要完全替换它:
$("#element").html('<div id="source">...</div>');
如果您想在上述任何一项之前复制一个元素:
$("#destination").append($("#source").clone());
// etc.
您可以使用:
在之后插入,
jQuery("#source").insertAfter("#destination");
要插入另一个元素,
jQuery("#source").appendTo("#destination");
您可以使用以下代码将源移动到目标
jQuery("#source")
.detach()
.appendTo('#destination');
尝试工作codepen
函数 move() { jQuery("#source") .detach() .appendTo('#destination'); } #source{ 背景颜色:红色;颜色:#ffffff;显示:内联块;填充:35px; } #destination{ 背景颜色:蓝色;颜色:#ffffff;显示:内联块;填充:50px; }
如果您想要快速演示以及有关如何移动元素的更多详细信息,请尝试以下链接:
http://html-tuts.com/move-div-in-another-div-with-jquery
这是一个简短的例子:
要在元素上方移动:
$('.whatToMove').insertBefore('.whereToMove');
在元素之后移动:
$('.whatToMove').insertAfter('.whereToMove');
要在元素内移动,请在该容器内的所有元素之上:
$('.whatToMove').prependTo('.whereToMove');
要在元素内移动,请在该容器内的所有元素之后:
$('.whatToMove').appendTo('.whereToMove');
老问题,但在这里,因为我需要将内容从一个容器移动到另一个容器,包括所有事件侦听器。
jQuery 没有办法做到这一点,但标准 DOM 函数 appendChild 可以。
//assuming only one .source and one .target
$('.source').on('click',function(){console.log('I am clicked');});
$('.target')[0].appendChild($('.source')[0]);
使用 appendChild 删除 .source 并将其放入目标中,包括它的事件侦听器:https://developer.mozilla.org/en-US/docs/Web/API/Node.appendChild
您也可以尝试:
$("#destination").html($("#source"))
但这将完全覆盖您在 #destination
中的所有内容。
您可以使用纯 JavaScript,使用 appendChild()
方法...
appendChild() 方法附加一个节点作为节点的最后一个子节点。提示:如果要创建带有文本的新段落,请记住将文本创建为附加到段落的文本节点,然后将段落附加到文档。您还可以使用此方法将元素从一个元素移动到另一个元素。提示:使用 insertBefore() 方法在指定的现有子节点之前插入新的子节点。
因此,您可以这样做来完成这项工作,这是我为您创建的,使用 appendChild()
,运行并查看它如何适用于您的案例:
函数 appendIt() { var source = document.getElementById("source"); document.getElementById("destination").appendChild(source); } #source { 颜色:白色;背景:绿色;填充:4px 8px; } #destination { 颜色:白色;背景:红色;填充:4px 8px; } 按钮 { 边距顶部:20px; }
Source
Destination
我注意到巨大的内存泄漏和insertAfter
& 之间的性能差异after
或 insertBefore
& before
.. 如果您有大量 DOM 元素,或者您需要在 MouseMove 事件 中使用 after()
或 before()
,浏览器内存可能会增加,并且下一个操作会运行得很慢.
我刚刚体验的解决方案是使用inserBefore 代替before()
和inserAfter 代替after()
。
为了完整起见,在this article中提到了另一种方法wrap()
或wrapAll()
。因此,OP 的问题可能由此解决(即,假设 <div id="destination" />
尚不存在,以下方法将从头开始创建这样的包装器 - OP 不清楚包装器是否已经存在):
$("#source").wrap('<div id="destination" />')
// or
$(".source").wrapAll('<div id="destination" />')
听起来很有希望。但是,当我尝试在这样的多个嵌套结构上执行 $("[id^=row]").wrapAll("<fieldset></fieldset>")
时:
<div id="row1">
<label>Name</label>
<input ...>
</div>
它正确地包装了那些 <div>...</div>
和 <input>...</input>
但不知何故遗漏了 <label>...</label>
。所以我最终改用显式 $("row1").append("#a_predefined_fieldset")
。所以,YMMV。
it will be moved into the target (not cloned) and a new set consisting of the inserted element is returned
- api.jquery.com/appendto