ChatGPT解决这个技术问题 Extra ChatGPT

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

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

<div id="source">
...
</div>

进入这个:

<div id="destination">
...
</div>

所以我有这个:

<div id="destination">
  <div id="source">
    ...
  </div>
</div>
只需使用 $(target_element).append(to_be_inserted_element);
或者:destination.appendChild(source) 使用纯 javascript
我们可以使用 CSS 实现这一点吗?那可能吗 ?
@RajKumarSamala CSS 不能改变 HTML 的结构,只能改变它的表现形式。

C
Clonkex

您可能想要使用 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 纯红色; }

main
将我移到主目录


警告这在 jQuery mobile 中可能无法正常工作,因为它可能会创建该元素的另一个副本。
appenTo 是创建副本还是实际将整个 div 移动到目的地? (因为如果它复制,它会在通过 id 调用 div 时产生错误)
这是一篇关于在 jQuery 中删除、替换和移动元素的优秀文章:elated.com/articles/jquery-removing-replacing-moving-elements
请注意 appendTo 的 jQuery 文档说明元素已移动:it will be moved into the target (not cloned) and a new set consisting of the inserted element is returned - api.jquery.com/appendto
你没有移动它,只是追加。下面的答案做了一个适当的移动。
R
René Sackers

我的解决方案:

移动:

jQuery("#NodesToMove").detach().appendTo('#DestinationContainerNode')

复制:

jQuery("#NodesToMove").appendTo('#DestinationContainerNode')

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


最佳答案。接受的答案会创建一个副本,不会像问题要求的那样移动元素。
抱歉,但 Andrew Hare 接受的答案是正确的 - 分离是不必要的。在上面的 Pixic 的 JSFiddle 中尝试一下——如果你删除了分离调用,它的工作原理完全相同,即它会移动,而不是复制。这是只进行了一个更改的分支:jsfiddle.net/D46y5 如 API 中所述:api.jquery.com/appendTo:“如果以这种方式选择的元素插入到 DOM 中其他位置的单个位置,它将被移动到目标中(未克隆) 并返回由插入元素组成的新集合"
t
tyler.frankenstein

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

Check it out.


为什么使用 createDocumentFragment 而不是简单的 document.getElementById('destination').appendChild(document.getElementById('source'))?
C
Cᴏʀʏ

我刚用过:

$('#source').prependTo('#destination');

我从 here 中获取的。


好吧,当您想保留元素并稍后重新插入它时,分离很有用,但在您的示例中,无论如何您都会立即重新插入它。
B
Bekim Bacaj

曾经尝试过纯 JavaScript...destination.appendChild(source); 吗?

onclick = function(){destination.appendChild(source); } div{ 边距:.1em; } #destination{ 边框:实心 1px 红色; } #source {border:solid 1px gray; }

###
***


7
7 revs, 2 users 66%

如果您要放置元素的 div 内部有内容,并且您希望元素在主要内容之后显示

  $("#destination").append($("#source"));

如果您想要放置元素的 div 里面有内容,并且您想要在 之前 显示元素的主要内容:

$("#destination").prepend($("#source"));

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

$("#element").html('<div id="source">...</div>');

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

$("#destination").append($("#source").clone());
// etc.

A
AlexC

您可以使用:

在之后插入,

jQuery("#source").insertAfter("#destination");

要插入另一个元素,

jQuery("#source").appendTo("#destination");

S
Subodh Ghulaxe

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

 jQuery("#source")
       .detach()
       .appendTo('#destination');

尝试工作codepen

函数 move() { jQuery("#source") .detach() .appendTo('#destination'); } #source{ 背景颜色:红色;颜色:#ffffff;显示:内联块;填充:35px; } #destination{ 背景颜色:蓝色;颜色:#ffffff;显示:内联块;填充:50px; }

我是源码
我是目的地


D
Dan

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

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

这是一个简短的例子:

要在元素上方移动:

$('.whatToMove').insertBefore('.whereToMove');

在元素之后移动:

$('.whatToMove').insertAfter('.whereToMove');

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

$('.whatToMove').prependTo('.whereToMove');

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

$('.whatToMove').appendTo('.whereToMove');

H
HMR

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

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


f
frb

您也可以尝试:

$("#destination").html($("#source"))

但这将完全覆盖您在 #destination 中的所有内容。


A
Alireza

您可以使用纯 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


A
AI Perera

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

我刚刚体验的解决方案是使用inserBefore 代替before() 和inserAfter 代替after()


K
Kamil Kiełczewski

Bekim Bacaj answer 的脏大小改进

div {边框:1px 实心;边距:5px }

点击我
...


R
RayLuo

为了完整起见,在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。