DIV要素を別の要素内に移動したいと思います。たとえば、これを移動したい(すべての子を含む):
<div id="source">
...
</div>
これに:
<div id="destination">
...
</div>
私がこれを持っているように:
<div id="destination">
<div id="source">
...
</div>
</div>
DIV要素を別の要素内に移動したいと思います。たとえば、これを移動したい(すべての子を含む):
<div id="source">
...
</div>
これに:
<div id="destination">
...
</div>
私がこれを持っているように:
<div id="destination">
<div id="source">
...
</div>
</div>
回答:
単純なJavaScriptを試したことはありますdestination.appendChild(source);
か?
onclick = function(){ destination.appendChild(source); }
div{ margin: .1em; }
#destination{ border: solid 1px red; }
#source {border: solid 1px gray; }
<!DOCTYPE html>
<html>
<body>
<div id="destination">
###
</div>
<div id="source">
***
</div>
</body>
</html>
onclick
の前にキーワードvar
を付けて投稿を強化しようとしましたが、それは誤りです。
appendTo
(要素の最後に追加する)関数を使用することができます。
$("#source").appendTo("#destination");
または、次のprependTo
関数を使用することもできます(要素の先頭に追加されます)。
$("#source").prependTo("#destination");
例:
it will be moved into the target (not cloned) and a new set consisting of the inserted element is returned
- api.jquery.com/appendto
私の解決策:
移動:
jQuery("#NodesToMove").detach().appendTo('#DestinationContainerNode')
コピー:
jQuery("#NodesToMove").appendTo('#DestinationContainerNode')
.detach()の使い方に注意してください。コピーするときは、IDを複製しないように注意してください。
$('#nodeToMove').insertAfter('#insertAfterThisElement');
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);
場合はdiv
、あなたの要素を配置する場所、コンテンツの内部を持っており、あなたは要素を表示させたい後メインコンテンツ:
$("#destination").append($("#source"));
場合はdiv
、あなたの要素を配置する場所、コンテンツの内部を持って、あなたは要素を表示する前に、主な内容:
$("#destination").prepend($("#source"));
場合はdiv
、あなたの要素を配置する場所は空である、またはあなたがしたい置き換えるそれを完全に:
$("#element").html('<div id="source">...</div>');
上記のいずれかの前に要素を複製する場合:
$("#destination").append($("#source").clone());
// etc.
簡単なデモと要素の移動方法の詳細が必要な場合は、次のリンクを試してください。
http://html-tuts.com/move-div-in-another-div-with-jquery
以下に短い例を示します。
要素の上に移動するには:
$('.whatToMove').insertBefore('.whereToMove');
要素の後に移動するには:
$('.whatToMove').insertAfter('.whereToMove');
要素内に移動するには、そのコンテナ内のすべての要素の上に移動します。
$('.whatToMove').prependTo('.whereToMove');
要素内に移動するには、そのコンテナ内のすべての要素の後:
$('.whatToMove').appendTo('.whereToMove');
次のコードを使用して、ソースを宛先に移動できます
jQuery("#source")
.detach()
.appendTo('#destination');
古い質問ですが、すべてのイベントリスナーを含むコンテナ間でコンテンツを移動する必要があるため、ここに来ました。
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
。
私は間の巨大なメモリリークとパフォーマンスの違いに気づいinsertAfter
&after
またはinsertBefore
&before
..あなたは、DOM要素のトンを持っている、またはあなたが使用する必要がある場合after()
やbefore()
内部のMouseMoveイベントを、ブラウザのメモリは、おそらく増加し、次の操作が本当に遅い実行されます。
私が今経験した解決策は、代わりbefore()
にinserBefore を使用し、代わりにinsertAfter を使用することafter()
です。
appendChild()
メソッドを使用して純粋なJavaScriptを使用できます...
appendChild()メソッドは、ノードをノードの最後の子として追加します。
ヒント:テキスト付きの新しい段落を作成する場合は、テキストを段落に追加するテキストノードとして作成し、その段落をドキュメントに追加してください。
このメソッドを使用して、要素をある要素から別の要素に移動することもできます。
ヒント:指定された既存の子ノードの前に新しい子ノードを挿入するには、insertBefore()メソッドを使用します。
だからあなたは仕事をするためにそれを行うことができます、これは私があなたのために作成したもので、を使用appendChild()
して実行し、あなたのケースでどのように機能するかを確認します:
function appendIt() {
var source = document.getElementById("source");
document.getElementById("destination").appendChild(source);
}
#source {
color: white;
background: green;
padding: 4px 8px;
}
#destination {
color: white;
background: red;
padding: 4px 8px;
}
button {
margin-top: 20px;
}
<div id="source">
<p>Source</p>
</div>
<div id="destination">
<p>Destination</p>
</div>
<button onclick="appendIt()">Move Element</button>
完全を期すために、この記事では別のアプローチ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>
SOMEHOWはを除外し<label>...</label>
ます。そのため、$("row1").append("#a_predefined_fieldset")
代わりに明示的に使用することになりました。だから、YMMV。
Bekim Bacaj回答のダーティサイズの改善
div { border: 1px solid ; margin: 5px }
<div id="source" onclick="destination.appendChild(this)">click me</div>
<div id="destination" >...</div>