Рухомий елемент JavaScript у DOM


97

Скажімо, у мене є три <div>елементи на сторінці. Як я можу поміняти місцями позиції першого та третього <div>? jQuery чудово.

Відповіді:


110

Тривіальний з jQuery

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

Якщо ви хочете робити це неодноразово, вам потрібно буде використовувати різні селектори, оскільки диви зберігатимуть свої ідентифікатори під час їх переміщення.

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

1
@Ionut - справа в тому, що це залежить від відносного розміщення елементів. Після зміни порядку ви більше не можете знайти перше і третє за їхніми ідентифікаторами, і вам потрібно розробити інший спосіб. Моя відповідь була призначена лише для того, щоб проілюструвати функціональність методів виконання заданого завдання, а не бути комплексним рішенням для заміни першого та третього знаків у безліч довільної кількості разів.
tvanfosson

Привіт, хлопці, швидке запитання: Чи є простий спосіб повернутись до початкового стану Dom, коли вищевказана функція jquery буде завершена?
Вікіта

@Vikita - так, збережіть оригінальний HTML, а потім відновіть його. Можливо, вам доведеться повторно застосувати будь-які обробники, якщо вони були безпосередньо застосовані замість делегованого вищому елементу. Наприклад,var html = $('#container').html(); ...; $('#container').html(html);
tvanfosson

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повертає живий NodeList, який автоматично оновлюється, щоб відображати порядок елементів у DOM під час їх маніпулювання.

Ви також можете використовувати:

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 - не кажучи вже про розширені можливості поза межами коробки.
Божевільний Джо Маллой

13
Так, але хто тільки робить це одне?
tvanfosson

1
... або на сторінці є лише 3 діви
Райан Флоренція

38
@everybody: в оригінальному запитанні було задано питання про те, як замінити третій та перший діви на сторінці, де було три діви. На це я відповів. Якби у ОП було складніше питання, вони мали б його задати, і вони отримали б більш складну відповідь ;-)
NickFitz

26
Якщо хтось шукає цього у 2014 році, будь ласка, врахуйте цю відповідь. Тоді jQuery був корисним, але тепер це вже не так корисно, тому що браузери стандартизовані, тому не потрібно додавати бібліотеку 80 кб просто для виконання такого простого завдання. Крім того, ви не дізнаєтеся, що насправді DOM, поки ви не спробуєте його без jQuery :)
gustavohenke

29

.до і після

Використовуйте сучасний ванільний JS! Шлях краще / чистіше, ніж раніше. Не потрібно посилатися на батьків.

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

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

Підтримка браузера - 94,23% глобально станом на липень 20 року


Ще немає підтримки Internet Explorer.
justnorris

11
Вам не потрібно писати менш підтримуваний код, щоб підтримувати людей у ​​старих браузерах або не відповідають стандартам. Якщо ви не працюєте на підприємстві, мало користувачів пропустять
Gibolt

Інші методи так само добре справляються з ремонтом, особливо під час роботи в хорошій чистій функції. Я все для написання сучасного коду, але це кровоточить край. Приємно знати, що перед вами майбутнє, але наскільки я не люблю все, що стосується IE - важливо знати, який вплив мають ваші рішення. У цьому випадку - зламаний веб-додаток у будь-якому браузері IE. Якщо з тобою все гаразд - чудово! Я додав коментар лише для того, щоб повідомити комусь про
гугл

1
Отже, 27% користувачів - це кілька користувачів ? Ми говоримо мільйони!
SandRock

5
Через рік це число буде ближче до 10%. Це переважно мобільні пристрої підприємств, державних установ та старих. Зазвичай це означає неперсональні пристрої або менш технічно схильних користувачів. Відповіді слід шукати вперед, щоб ми не
зациклювалися на

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

Ця функція може здатися дивною, але вона сильно покладається на стандарти, щоб правильно функціонувати. Насправді, може здатися, що він працює краще, ніж версія jQuery, яку опублікував tvanfosson, яка, схоже, робить своп лише двічі.

На які особливості стандарту вона покладається?

insertBefore Вставляє вузол newChild перед існуючим дочірнім вузлом refChild. Якщо refChild є нульовим, вставте newChild в кінці списку дітей. Якщо newChild є об'єктом DocumentFragment, всі його дочірні програми вставляються в тому ж порядку перед refChild. Якщо newChild вже в дереві, його спочатку видаляють.


0

Підхід Jquery, згаданий вгорі, спрацює. Ви також можете використовувати JQuery та CSS. Скажімо, наприклад, на Div один ви застосували class1 та div2, ви застосували class class2 (скажімо, наприклад, що кожен клас css надає певну позицію в браузері), тепер ви можете обмінятись класами, використовуючи jquery або javascript (це змінить позицію)


0

Вибачте за те, що натрапив на цю тему, я натрапив на проблему "підміняти DOM-елементи" і трохи пограв

Результат - це "вирішення", яке є рідним jQuery, яке, здається, є дуже гарним (на жаль, я не знаю, що відбувається з внутрішніми jQuery при цьому)

Код:

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

Документація jQuery говорить, що insertAfter() переміщує елемент і не клонує його

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.