Как поменять элементы HTML в JavaScript? - PullRequest
13 голосов
/ 31 мая 2010

Я использую классический Javascript для сценариев DOM, у меня есть набор DIV в контейнере DIV. По событию click дочернего DIV, я хочу, чтобы дочерний DIV, вызвавший событие, был заменен на DIV над ним. мой код идет сюда ..

 <div id="container">
        <div onclick="swapDiv(event);">1</div>
        <div onclick="swapDiv(event);">2</div>
        <div onclick="swapDiv(event);">3</div>
 </div>

если нажата кнопка DIV 2, ее следует заменить на DIV 1

Ответы [ 6 ]

15 голосов
/ 31 мая 2010

Свойство parentNode элемента дает вам его родительский узел. Элементы имеют функцию insertBefore, которая вставляет элемент перед другим ссылочным элементом (перемещая его, если он уже находится в другом месте дерева). И у узлов есть previousSibling, который дает вам предыдущий одноуровневый узел (который может быть или не быть элементом). Итак:

function swapDiv(elm) {
    var previous = findPrevious(elm);
    if (previous) {
        elm.parentNode.insertBefore(elm, previous);
    }
}

... где findPrevious выглядит так:

function findPrevious(elm) {
   do {
       elm = elm.previousSibling;
   } while (elm && elm.nodeType != 1);
   return elm;
}

... где ваши атрибуты onclick должны быть:

onclick="swapDiv(this);"

... хотя вы можете вместо этого изучить перехват событий DOM2 (addEventListener или attachEvent в IE).

Немного ОТ, но я могу порекомендовать использовать любую из нескольких доступных библиотек, которые облегчат вашу жизнь, например, Прототип , jQuery , Закрытие или любой из нескольких других . На самом деле, в более ранней версии была ошибка, потому что это было , что давно, когда я имел дело с DOM напрямую. : -)

13 голосов
/ 31 мая 2010

Этот код будет делать то, что вы хотите (если вы хотите поменять местами выбранный элемент с первым дочерним элементом). Если вы хотите что-то еще, вам нужно быть более точным.

<script type="text/javascript">

function swapDiv(event,elem){
    elem.parentNode.insertBefore(elem,elem.parentNode.firstChild);
}

</script>


 <div id="container">
        <div onclick="swapDiv(event,this);">1</div>
        <div onclick="swapDiv(event,this);">2</div>
        <div onclick="swapDiv(event,this);">3</div>
 </div>
2 голосов
/ 21 сентября 2018

Это работает для братьев и сестер, должно работать для любых двух узлов:

function swapElements(el1, el2) {
    let prev1 = el1.previousSibling;
    let prev2 = el2.previousSibling;

    prev1.after(el2);
    prev2.after(el1);
}
2 голосов
/ 31 мая 2010

В принципе, вы просто insertBefore щелкаете своим элементом до того, как у него есть предыдущий элемент. Однако наличие пробельных текстовых узлов делает это более раздражающим, чем это должно быть в традиционных сценариях. Element Traversal API сделает это проще, но до тех пор, пока он не станет более широко поддерживаемым в браузерах, нужны вспомогательные функции, например:

<div id="container">
    <div>1</div>
    <div>2</div>
    <div>3</div>
</div>

<script type="text/javascript">
    // Bind event to each line div
    //
    var div= firstElementChild(document.getElementById('container'));
    while (div!==null) {
        div.onclick= swapWithPreviousElement;
        div= nextElementSibling(div);
    }

    // Move element before its previous element sibling
    //
    function swapWithPreviousElement() {
        var previous= previousElementSibling(this);
        if (previous!==null)
            this.parentNode.insertBefore(this, previous);
    }


    // We've used some Element Traversal API methods but some
    // browsers don't support them yet. Provide wrapper functions
    // for compatibility.
    //
    function previousElementSibling(element) {
        if ('previousElementSibling' in element)
            return element.previousElementSibling;
        do
            element= element.previousSibling;
        while (element!==null && element.nodeType!==1);
        return element;
    }
    function nextElementSibling(element) {
        if ('nextElementSibling' in element)
            return element.nextElementSibling;
        do
            element= element.nextSibling;
        while (element!==null && element.nodeType!==1);
        return element;
    }
    function firstElementChild(element) {
        if ('firstElementChild' in element)
            return element.firstElementChild;
        var child= element.firstChild;
        while (child!==null && child.nodeType!==1)
            child= child.nextSibling;
        return child;
    }
</script>
2 голосов
/ 31 мая 2010

По звукам вы просто хотите поменять местами div с div перед ним, следовательно, с previousSibling. Возможно, вы могли бы посмотреть на выполнение insertBefore, но вместо создания нового элемента используйте существующий. Я не уверен, что произойдет с прикрепленными событиями, если они будут скопированы правильно.

0 голосов
/ 15 июня 2017

Поменяйте местами любые узлы, не братья и сестры, не прилагательные братья и сестры, ни временные узлы, ни клонирование, ни jquery ... IE9 +

function swapNodes(n1, n2) {

    var p1 = n1.parentNode;
    var p2 = n2.parentNode;
    var i1, i2;

    if ( !p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1) ) return;

    for (var i = 0; i < p1.children.length; i++) {
        if (p1.children[i].isEqualNode(n1)) {
            i1 = i;
        }
    }
    for (var i = 0; i < p2.children.length; i++) {
        if (p2.children[i].isEqualNode(n2)) {
            i2 = i;
        }
    }

    if ( p1.isEqualNode(p2) && i1 < i2 ) {
        i2++;
    }
    p1.insertBefore(n2, p1.children[i1]);
    p2.insertBefore(n1, p2.children[i2]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...