DOM内のJavaScript移動要素


97

<div>ページに3つの要素があるとします。最初と3番目の位置を入れ替えるにはどうすればよい<div>ですか?jQueryは問題ありません。

回答:


110

jQuery簡単

$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');

繰り返し実行する場合は、divが移動してもIDが保持されるため、別のセレクターを使用する必要があります。

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});

1
@Ionut-要点は、要素の相対的な配置に依存することです。順序を変更すると、IDで最初と3番目を見つけることができなくなり、別の方法で解決する必要があります。私の答えは、要求されたタスクを実行するためのメソッドの機能を説明することだけを目的としており、セット内の最初と3番目のdivを任意の回数交換する包括的なソリューションではありませんでした。
tvanfosson

こんにちは皆さん、簡単な質問:上記のjquery関数が完了したら、元のDom状態にリセットする簡単な方法はありますか?
Vikita

@Vikita-はい、元のHTMLを保存してから復元します。ハンドラーを上位の要素に委任する代わりに直接適用した場合は、ハンドラーを再適用する必要があります。たとえば、var html = $('#container').html(); ...; $('#container').html(html);
tvanfosson 2013年

171

そのような些細なタスクのためにライブラリを使用する必要はありません:

var divs = document.getElementsByTagName("div");   // order: first, second, third
divs[2].parentNode.insertBefore(divs[2], divs[0]); // order: third, first, second
divs[2].parentNode.insertBefore(divs[2], divs[1]); // order: third, second, first

これは、getElementsByTagName操作時にDOM内の要素の順序を反映するように自動的に更新されるライブNodeList を返すという事実を考慮しています。

あなたも使うことができます:

var divs = document.getElementsByTagName("div");   // order: first, second, third
divs[0].parentNode.appendChild(divs[0]);           // order: second, third, first
divs[1].parentNode.insertBefore(divs[0], divs[1]); // order: third, second, first

実験したい場合は、他にもさまざまな組み合わせが考えられます。

divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0]));

例えば ​​:-)


15
確かに、しかしjQueryのような何かが提供する優雅さと読みやすさについて議論するのは難しいです-箱から出して強化された機能は言うまでもありません。
Crazy Joe Malloy、

13
はい、でもこれは誰がするのですか?
tvanfosson

1
...またはページに3つのdivしかない
Ryan Florence

38
@everybody:元の質問では、3つのdivがあるページで3番目と最初のdivを入れ替える方法を尋ねていました。それが私が答えた質問でした。OPにもっと複雑な質問があった場合、彼らはそれを尋ねるべきでした、そして彼らはもっと複雑な答えを得たでしょう;-)
NickFitz

26
2014年にこれを探している人がいたら、この回答を検討してください。jQueryは当時は便利でしたが、今ではブラウザーは標準化されているため、それほど便利ではありません。このような単純なタスクを実行するためだけに80 kbのライブラリを追加する必要はありません。また、jQueryなしで試してみるまで、DOMが実際に何であるかを知ることはできません:)
gustavohenke

29

。前後

最新のバニラJSを使用してください!以前よりずっと良い/よりきれいです。親を参照する必要はありません。

const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
const div3 = document.getElementById("div3");

div2.after(div1);
div2.before(div3);

ブラウザのサポート -20年7月の時点で94.23%グローバル


Internet Explorerはまだサポートされていません。
justnorris

11
古いブラウザや標準に準拠していないブラウザのユーザーをサポートするために、保守性の低いコードを記述する必要はありません。企業で働いていない限り、見逃してしまうユーザーはほとんどいない
Gibolt

他のメソッドは、特にすてきなクリーンな関数でラップするときに、保守性に関しても同様に機能します。私は現代のコードを書くのがすべてですが、これは最先端です。将来がどうなるかを知ることは素晴らしいことですが、IEに関連するものを嫌うのと同じくらい、あなたの決定の影響が何であるかを知ることは重要です。この場合-IEブラウザーで壊れたWebアプリ。それでいいのなら-すばらしい!私はこれをグーグルする人に知らせるためだけにコメントを追加しました:)
justnorris

1
したがって、ユーザーの27%は数人のユーザーですか?何百万人と話しています!
SandRock

5
1年で、その数は10%に近くなります。主に企業、政府、および古いモバイルデバイスです。これは通常、非個人的なデバイスまたはそれほど技術的ではないユーザーを意味します。2009
行き詰まら

11
jQuery.fn.swap = function(b){ 
    b = jQuery(b)[0]; 
    var a = this[0]; 
    var t = a.parentNode.insertBefore(document.createTextNode(''), a); 
    b.parentNode.insertBefore(a, b); 
    t.parentNode.insertBefore(b, t); 
    t.parentNode.removeChild(t); 
    return this; 
};

次のように使用します。

$('#div1').swap('#div2');

jQueryを使用したくない場合は、関数を簡単に変更できます。


5
var swap = function () {
    var divs = document.getElementsByTagName('div');
    var div1 = divs[0];
    var div2 = divs[1];
    var div3 = divs[2];

    div3.parentNode.insertBefore(div1, div3);
    div1.parentNode.insertBefore(div3, div2);
};

この機能は奇妙に思えるかもしれませんが、正しく機能するためには規格に大きく依存しています。実際、tvanfossonが投稿したjQueryバージョンよりも機能が優れているように見えるかもしれません。

それはどの標準の特性に依存していますか?

insertBefore既存の子ノードrefChildの前にノードnewChildを挿入します。refChildがnullの場合、子のリストの最後にnewChildを挿入します。newChildがDocumentFragmentオブジェクトの場合、そのすべての子がrefChildの前に同じ順序で挿入されます。newChildがすでにツリーにある場合は、最初に削除されます。


0

上で述べたjqueryアプローチは機能します。また、JQueryとCSSを使用することもできます。たとえば、div1にclass1を適用し、div2にクラスclass2を適用したとします(たとえば、cssの各クラスがブラウザ上で特定の位置を提供するなど)、jqueryまたはjavascript(位置を変更します)


0

このスレッドにぶつかって申し訳ありません。「DOM要素の入れ替え」の問題に遭遇し、少し遊んでみました。

結果は、jQueryネイティブの「解決策」であり、これは本当にきれいに見えます(残念ながら、これを行うときにjQueryの内部で何が起こっているのかわかりません)。

コード:

$('#element1').insertAfter($('#element2'));

jQueryのドキュメントには、要素をinsertAfter() 移動し、それを複製しないと記載されています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.