DOM의 JavaScript 이동 요소


97

<div>한 페이지에 세 가지 요소 가 있다고 가정 해 보겠습니다 . 첫 번째와 세 번째 위치를 바꾸려면 어떻게 <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로 첫 번째와 세 번째를 찾을 수 없으며 다른 방법을 찾아야합니다. 내 대답은 요청 된 작업을 수행하는 방법의 기능을 설명하기위한 것이지 임의의 횟수로 첫 번째 및 세 번째 div를 교체하는 포괄적 인 솔루션이 아닙니다.
tvanfosson

안녕하세요, 간단한 질문입니다. 위의 jquery 함수가 완료되면 원래 Dom 상태로 다시 재설정하는 쉬운 방법이 있습니까?
Vikita 2013 년

@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

이는 getElementsByTagNameDOM 요소가 조작 될 때 요소의 순서를 반영하도록 자동으로 업데이트되는 라이브 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가있는 페이지에서 세 번째와 첫 번째 div를 바꾸는 방법을 물었습니다. 그것이 내가 대답 한 질문이었습니다. OP에 더 복잡한 질문이있는 경우 질문을 했어야했고 더 복잡한 답변을
받았을

26
2014 년에 이것을 찾고 있다면이 답변을 고려하십시오. 당시 jQuery는 유용했지만 이제는 더 이상 유용하지 않습니다. 브라우저가 표준화 되었기 때문에 이러한 간단한 작업을 수행하기 위해 80kb 라이브러리를 추가 할 필요가 없습니다. 당신이 :) 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 dec.

11
오래되었거나 표준을 따르지 않는 브라우저에서 사람들을 지원하기 위해 유지 관리가 덜한 코드를 작성할 필요가 없습니다. 기업에서 일하지 않는 한, 몇 명의 사용자가 놓칠 것입니다
Gibolt 2017-12-09

다른 방법은 특히 깔끔한 기능으로 래핑 할 때 유지 관리 측면에서도 잘 작동합니다. 나는 모두 현대적인 코드를 작성했지만 이것은 최첨단입니다. 미래가 어떻게 될지 아는 것은 좋지만 IE와 관련된 것은 무엇이든 싫어 합니다. 결정의 영향이 무엇인지 아는 것이 중요합니다 . 이 경우-모든 IE 브라우저에서 깨진 웹 앱입니다. 괜찮으 시다면-좋습니다! 난 그냥이 : 인터넷 검색 사람을 알려 코멘트를 추가
justnorris

1
그렇다면 사용자의 27 %가 소수 사용자 입니까? 우리는 수백만을 이야기하고 있습니다!
SandRock

5
1 년 안에 그 수치는 10 %에 가까워 질 것입니다. 대부분 기업, 정부 및 구형 모바일 장치입니다. 이것은 일반적으로 개인이 아닌 장치 또는 기술적으로 덜 익숙한 사용자를 의미합니다. 우리가 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; 
};

다음과 같이 사용하십시오.

$('#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를 사용할 수도 있습니다. 예를 들어 Div 1에서 class1 및 div2를 적용한 경우 class2 클래스를 적용했습니다 (예 : css의 각 클래스가 브라우저에서 특정 위치를 제공하는 경우). 이제 jquery를 사용하여 클래스를 교환 할 수 있습니다. javascript (위치가 변경됨)


0

이 스레드를 부딪쳐서 미안합니다. "Swap DOM-elements"문제를 우연히 발견하고 약간 놀았습니다.

결과는 정말 예쁜 것처럼 보이는 jQuery 네이티브 "솔루션"입니다 (불행히도이 작업을 수행 할 때 jQuery 내부에서 무슨 일이 일어나는지 모르겠습니다).

코드:

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

jQuery 문서는 요소 를 insertAfter() 이동 하고 복제하지 않는다고 말합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.