Elemento in movimento JavaScript nel DOM


97

Diciamo che ho tre <div>elementi su una pagina. Come posso scambiare le posizioni del primo e del terzo <div>? jQuery va bene.

Risposte:


110

Banale con jQuery

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

Se vuoi farlo ripetutamente, dovrai utilizzare selettori diversi poiché i div manterranno i loro ID mentre vengono spostati.

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

1
@Ionut - il punto è che dipende dal posizionamento relativo degli elementi. Una volta modificato l'ordine, non è più possibile trovare il primo e il terzo in base agli ID e è necessario elaborare un altro modo. La mia risposta intendeva solo illustrare la funzionalità dei metodi per eseguire l'attività richiesta, non essere una soluzione completa per scambiare il primo e il terzo div in un set un numero arbitrario di volte.
tvanfosson

Ciao ragazzi, una domanda veloce: c'è un modo semplice per ripristinare lo stato Dom originale una volta completata la funzione jquery di cui sopra?
Vikita

@Vikita - sì, salva l'HTML originale e ripristinalo. Potrebbe essere necessario riapplicare eventuali gestori se sono stati applicati direttamente anziché delegati a un elemento superiore. Ad esempio,var html = $('#container').html(); ...; $('#container').html(html);
tvanfosson

171

Non è necessario utilizzare una libreria per un'attività così banale:

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

Ciò tiene conto del fatto che getElementsByTagNamerestituisce un NodeList live che viene aggiornato automaticamente per riflettere l'ordine degli elementi nel DOM man mano che vengono manipolati.

Potresti anche usare:

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

e ci sono varie altre possibili permutazioni, se hai voglia di sperimentare:

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

per esempio :-)


15
Vero, ma è difficile discutere con l'eleganza e la leggibilità che fornisce qualcosa come jQuery, per non parlare delle funzionalità avanzate fuori dagli schemi.
Crazy Joe Malloy

13
Sì, ma chi fa solo questa cosa?
tvanfosson

1
... o ha solo 3 div sulla pagina
Ryan Florence

38
@tutti: la domanda originale chiedeva come scambiare il terzo e il primo div su una pagina che aveva tre div. Questa era la domanda a cui ho risposto. Se l'OP avesse una domanda più complessa, avrebbero dovuto farla e avrebbero ottenuto una risposta più complessa ;-)
NickFitz

26
Se qualcuno lo cerca nel 2014, considera questa risposta. jQuery ERA utile allora, ma ora non è più così utile, perché i browser sono standardizzati, quindi non c'è bisogno di aggiungere una libreria da 80 kb solo per fare un compito così semplice. Inoltre, non puoi sapere cosa sia realmente il DOM finché non lo provi senza jQuery :)
gustavohenke

29

.prima e dopo

Usa il moderno Vanilla JS! Molto meglio / più pulito di prima. Non c'è bisogno di fare riferimento a un genitore.

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

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

Supporto browser - 94,23% globale a partire da luglio '20


Nessun supporto per Internet Explorer ancora.
justnorris

11
Non dovresti scrivere codice meno gestibile per supportare le persone su browser vecchi o non conformi agli standard. A meno che tu non lavori in azienda, pochi utenti perderanno l'occasione
Gibolt

Altri metodi funzionano altrettanto bene per quanto riguarda la manutenibilità, specialmente quando si avvolge in una bella funzione pulita. Sono tutto per scrivere codice moderno, ma questo è all'avanguardia. È bello sapere cosa riserva il futuro, ma per quanto non mi piaccia tutto ciò che riguarda IE, è importante sapere qual è l'impatto delle tue decisioni. In questo caso, un'app Web non funzionante in qualsiasi browser IE. Se per te va bene, fantastico! Ho aggiunto il commento solo per informare chiunque
cerchi su Google

1
Quindi il 27% degli utenti è costituito da pochi utenti ? Stiamo parlando di milioni!
SandRock

5
In un anno, quel numero sarà più vicino al 10%. Si tratta principalmente di dispositivi mobili aziendali, governativi e meno recenti. Questo di solito significa dispositivi non personali o utenti meno tecnicamente inclini. Le risposte dovrebbero essere lungimiranti, quindi non siamo bloccati nello sviluppo nel 2009.
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; 
};

e usalo in questo modo:

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

se non vuoi usare jQuery puoi facilmente adattare la funzione.


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

Questa funzione può sembrare strana, ma si basa molto sugli standard per funzionare correttamente. In effetti, potrebbe sembrare che funzioni meglio della versione jQuery che tvanfosson ha pubblicato che sembra fare lo scambio solo due volte.

Su quali peculiarità degli standard si basa?

insertBefore Inserisce il nodo newChild prima del nodo figlio esistente refChild. Se refChild è nullo, inserisci newChild alla fine dell'elenco dei figli. Se newChild è un oggetto DocumentFragment, tutti i suoi figli vengono inseriti, nello stesso ordine, prima di refChild. Se il newChild è già nell'albero, viene prima rimosso.


0

L'approccio Jquery menzionato in alto funzionerà. Puoi anche usare JQuery e CSS. Ad esempio su Div uno hai applicato class1 e div2 hai applicato class class2 (ad esempio, ogni classe di CSS fornisce una posizione specifica sul browser), ora puoi scambiare le classi usando jquery o javascript (che cambierà la posizione)


0

Ci scusiamo per aver urtato questo thread, sono incappato nel problema dello "scambio di elementi DOM" e ho giocato un po '

Il risultato è una "soluzione" nativa di jQuery che sembra essere davvero carina (sfortunatamente non so cosa stia succedendo agli interni di jQuery quando lo faccio)

Il codice:

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

La documentazione di jQuery dice che insertAfter() sposta l'elemento e non lo clona

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.