Verschiebendes JavaScript-Element im DOM

97

Angenommen, ich habe drei <div>Elemente auf einer Seite. Wie kann ich die Positionen des ersten und dritten tauschen <div>? jQuery ist in Ordnung.

Ader
quelle

Antworten:

109

Trivial mit jQuery

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

Wenn Sie dies wiederholt tun möchten, müssen Sie verschiedene Selektoren verwenden, da die Divs ihre IDs behalten, wenn sie verschoben werden.

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});
Tvanfosson
quelle
1
@Ionut - der Punkt ist, dass es von der relativen Positionierung der Elemente abhängt. Sobald Sie die Reihenfolge geändert haben, können Sie die erste und dritte nicht mehr anhand ihrer IDs finden und müssen einen anderen Weg finden. Meine Antwort sollte nur die Funktionalität der Methoden zur Erfüllung der angeforderten Aufgabe veranschaulichen und keine umfassende Lösung für das willkürliche Austauschen der ersten und dritten Divs in einem Satz sein.
Tvanfosson
Hallo Leute, eine kurze Frage: Gibt es eine einfache Möglichkeit, nach Abschluss der obigen Abfragefunktion wieder in den ursprünglichen Dom-Status zurückzukehren?
Vikita
@ Vikita - Ja, speichern Sie den ursprünglichen HTML-Code und stellen Sie ihn wieder her. Möglicherweise müssen Sie alle Handler erneut anwenden, wenn sie direkt angewendet wurden, anstatt an ein höheres Element delegiert zu werden. Zum Beispielvar html = $('#container').html(); ...; $('#container').html(html);
Tvanfosson
171

Es ist nicht erforderlich, eine Bibliothek für eine so triviale Aufgabe zu verwenden:

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

Dies berücksichtigt die Tatsache, dass getElementsByTagNameeine Live-NodeList zurückgegeben wird, die automatisch aktualisiert wird, um die Reihenfolge der Elemente im DOM widerzuspiegeln, wenn sie bearbeitet werden.

Sie könnten auch verwenden:

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

und es gibt verschiedene andere mögliche Permutationen, wenn Sie experimentieren möchten:

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

zum Beispiel :-)

NickFitz
quelle
15
Es stimmt, aber es ist schwer, mit der Eleganz und Lesbarkeit zu argumentieren, die so etwas wie jQuery bietet - ganz zu schweigen von den sofort einsatzbereiten erweiterten Funktionen.
Verrückter Joe Malloy
13
Ja, aber wer macht nur das eine?
Tvanfosson
1
... oder hat nur 3 Divs auf der Seite
Ryan Florence
38
@everybody: In der ursprünglichen Frage wurde gefragt, wie der dritte und der erste Teil auf einer Seite mit drei Teilen ausgetauscht werden sollen. Das war die Frage, die ich beantwortet habe. Wenn das OP eine komplexere Frage hätte, hätten sie sie stellen sollen, und sie hätten eine komplexere Antwort bekommen ;-)
NickFitz
26
Wenn jemand 2014 danach sucht, berücksichtigen Sie bitte diese Antwort. jQuery war damals nützlich, aber jetzt ist es nicht mehr so ​​nützlich, da die Browser standardisiert sind und Sie keine 80-KB-Bibliothek hinzufügen müssen, um eine so einfache Aufgabe zu erledigen. Außerdem
erfährst
28

.vorher und nachher

Verwenden Sie moderne Vanille JS! Viel besser / sauberer als zuvor. Keine Notwendigkeit, einen Elternteil zu referenzieren.

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

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

Browser-Unterstützung - 94,23% global ab 20. Juli

Gibolt
quelle
Noch keine Internet Explorer-Unterstützung.
Justnorris
11
Sie sollten keinen weniger wartbaren Code schreiben müssen, um Benutzer in Browsern zu unterstützen, die alt sind oder nicht den Standards entsprechen. Wenn Sie nicht im Unternehmen arbeiten, werden nur wenige Benutzer dies verpassen
Gibolt
Andere Methoden funktionieren in Bezug auf die Wartbarkeit genauso gut, insbesondere beim Einwickeln in eine schöne, saubere Funktion. Ich bin alles dafür, modernen Code zu schreiben, aber das ist auf dem neuesten Stand. Es ist großartig zu wissen, was die Zukunft bringt, aber so sehr ich alles, was mit IE zu tun hat, nicht mag, ist es wichtig zu wissen, wie sich Ihre Entscheidungen auswirken. In diesem Fall - eine kaputte Web-App in einem beliebigen IE-Browser. Wenn das für dich in Ordnung ist - großartig! Ich habe den Kommentar hinzugefügt, um jeden zu informieren, der dies
googelt
1
27% der Benutzer sind also einige Benutzer ? Wir reden über Millionen!
SandRock
5
In einem Jahr wird diese Zahl näher bei 10% liegen. Es handelt sich hauptsächlich um Unternehmen, Behörden und ältere mobile Geräte. Dies bedeutet normalerweise nicht persönliche Geräte oder weniger technisch versierte Benutzer. Die Antworten sollten zukunftsgerichtet sein, damit wir uns 2009 nicht weiterentwickeln.
Gibolt
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; 
};

und benutze es so:

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

Wenn Sie jQuery nicht verwenden möchten, können Sie die Funktion problemlos anpassen.

Darin Dimitrov
quelle
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);
};

Diese Funktion mag seltsam erscheinen, stützt sich jedoch stark auf Standards, um ordnungsgemäß zu funktionieren. Tatsächlich scheint es besser zu funktionieren als die von tvanfosson veröffentlichte jQuery-Version, die den Tausch nur zweimal durchzuführen scheint.

Auf welche Besonderheiten stützt es sich?

insertBefore Fügt den Knoten newChild vor dem vorhandenen untergeordneten Knoten refChild ein. Wenn refChild null ist, fügen Sie newChild am Ende der Liste der untergeordneten Elemente ein. Wenn newChild ein DocumentFragment-Objekt ist, werden alle untergeordneten Objekte vor refChild in derselben Reihenfolge eingefügt. Wenn sich das neue Kind bereits im Baum befindet, wird es zuerst entfernt.

Ionuț G. Stan
quelle
0

Der oben erwähnte Jquery-Ansatz funktioniert. Sie können auch JQuery und CSS verwenden. Sagen Sie beispielsweise, dass Sie auf Div 1 Klasse 1 und Div 2 Klasse 2 angewendet haben (z. B. für jede Klasse von CSS, die eine bestimmte Position im Browser bereitstellt). Jetzt können Sie die Klassen mit jquery oder austauschen Javascript (das wird die Position ändern)

Rajat
quelle
0

Tut mir leid, dass ich diesen Thread gestoßen habe. Ich bin über das Problem "DOM-Elemente tauschen" gestolpert und habe ein bisschen herumgespielt

Das Ergebnis ist eine jQuery-native "Lösung", die wirklich hübsch zu sein scheint (leider weiß ich nicht, was dabei bei den jQuery-Interna passiert).

Der Code:

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

Die jQuery - Dokumentation sagt , dass insertAfter() bewegt sich das Element und nicht wahr Klon

Storrm
quelle