[javascript] 라이브러리를 사용하지 않고 JavaScript에서 다른 요소 뒤에 요소를 삽입하는 방법은 무엇입니까?

거기에 insertBefore()자바 스크립트,하지만 내가 어떻게 요소를 삽입 할 수 있습니다 jQuery를 또는 다른 라이브러리를 사용하지 않고 다른 요소를?



답변

referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);

referenceNode당신이 원하는 노드는 어디에 있습니까 newNode? 경우 referenceNode때문에, 괜찮 부모 요소 내의 마지막 아이 인 referenceNode.nextSiblingnullinsertBefore핸들리스트의 말미에 추가하여 케이스 그게.

그래서:

function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

다음 스 니펫을 사용하여 테스트 할 수 있습니다.

function insertAfter(referenceNode, newNode) {
  referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

var el = document.createElement("span");
el.innerHTML = "test";
var div = document.getElementById("foo");
insertAfter(div, el);
<div id="foo">Hello</div>


답변

간단한 JavaScript는 다음과 같습니다.

전에 추가 :

element.parentNode.insertBefore(newElement, element);

추가 후 :

element.parentNode.insertBefore(newElement, element.nextSibling);

그러나 사용 편의성을 위해 일부 프로토 타입을 넣습니다.

다음 프로토 타입을 작성하면 새로 작성된 요소에서 직접이 함수를 호출 할 수 있습니다.

  • newElement.appendBefore(element);

  • newElement.appendAfter(element);

.appendBefore (element) 프로토 타입

Element.prototype.appendBefore = function (element) {
  element.parentNode.insertBefore(this, element);
},false;

.appendAfter (element) 프로토 타입

Element.prototype.appendAfter = function (element) {
  element.parentNode.insertBefore(this, element.nextSibling);
},false;

그리고 모든 것을 실제로 보려면 다음 코드 스 니펫을 실행하십시오.

JSFiddle에서 실행


답변

insertAdjacentHTML + outerHTML

elementBefore.insertAdjacentHTML('afterEnd', elementAfter.outerHTML)

거꾸로 :

  • DRYer : before 노드를 변수에 저장하고 두 번 사용할 필요는 없습니다. 변수 이름을 바꾸면 수정 빈도가 줄어 듭니다.
  • 골프를 친다 더보다 insertBefore(손익분기 기존 노드 변수 이름은 길이 3 개 문자 인 경우)

단점 :

  • https://caniuse.com/#feat=insert-adjacent 이후 새로운 브라우저 지원
  • outerHTML요소를 문자열로 변환 하기 때문에 이벤트와 같은 요소의 속성이 손실됩니다 . insertAdjacentHTML요소가 아닌 문자열의 내용을 추가 하기 때문에 필요합니다 .

답변

빠른 Google 검색 으로이 스크립트가 표시됩니다

// create function, it expects 2 values.
function insertAfter(newElement,targetElement) {
    // target is what you want it to go after. Look for this elements parent.
    var parent = targetElement.parentNode;

    // if the parents lastchild is the targetElement...
    if (parent.lastChild == targetElement) {
        // add the newElement after the target element.
        parent.appendChild(newElement);
    } else {
        // else the target has siblings, insert the new element between the target and it's next sibling.
        parent.insertBefore(newElement, targetElement.nextSibling);
    }
}


답변

하지만 insertBefore()(참조 MDN은 ) 여기에 대부분의 답변에 의한 크고 참조입니다. 유연성을 높이고 좀 더 명시 적으로 나타내려면 다음을 사용할 수 있습니다.

insertAdjacentElement()( MDN 참조 ) 이렇게하면 모든 요소를 ​​참조하고 원하는 위치로 이동할 요소를 정확하게 삽입 할 수 있습니다.

<!-- refElem.insertAdjacentElement('beforebegin', moveMeElem); -->
<p id="refElem">
    <!-- refElem.insertAdjacentElement('afterbegin', moveMeElem); -->
    ... content ...
    <!-- refElem.insertAdjacentElement('beforeend', moveMeElem); -->
</p>
<!-- refElem.insertAdjacentElement('afterend', moveMeElem); -->

유사한 사용 사례에 대해 고려해야 할 기타 사항 : insertAdjacentHTML()insertAdjacentText()

참고 문헌 :

https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentElement
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
https : // developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentText


답변

메소드 node.after( doc )는 다른 노드 뒤에 노드를 삽입합니다.

이 개 DOM 노드 node1node2,

node1.after(node2)node2이후에 삽입합니다 node1.

이 방법은 구형 브라우저에서는 사용할 수 없으므로 일반적으로 폴리 필이 필요합니다.


답변

2018 솔루션 (나쁜 연습, 2020으로 이동)

나는이 질문이 고대인 것을 알고 있지만 미래의 모든 사용자를 위해 수정 된 프로토 타입은이 프로토 타입이 존재하지 않는 .insertAfter 함수에 대한 마이크로 폴리 필입니다 baseElement.insertAfter(element);. 요소 프로토 타입에 직접 새로운 기능 을 추가합니다 .

Element.prototype.insertAfter = function(new) {
    this.parentNode.insertBefore(new, this.nextSibling);
}

라이브러리, 요지 또는 코드 (또는 참조 할 수있는 다른 위치)에 폴리 필을 배치하면 document.getElementById('foo').insertAfter(document.createElement('bar'));


2019 솔루션 (미운, 2020 년으로 이동)

새로운 편집 : 프로토 타입을 사용하지 않아야합니다. 기본 코드베이스를 덮어 쓰고 매우 효율적이거나 안전하지 않으며 호환성 오류가 발생할 수 있지만 비상업적 프로젝트의 경우 문제가되지 않습니다.
안전한 상용 기능을 원하면 기본 기능 만 사용하십시오. 예쁘지 않지만 작동합니다.

function insertAfter(el, newEl) {
    el.parentNode.insertBefore(newEl, this.nextSibling);
}

// use

const el = document.body || document.querySelector("body");
// the || means "this OR that"

el.insertBefore(document.createElement("div"), el.nextSibling);
// Insert Before

insertAfter(el, document.createElement("div"));
// Insert After 


2020 솔루션

ChildNode의 현재 웹 표준 : https://developer.mozilla.org/en-US/docs/Web/API/ChildNode

현재 생활 수준에 있으며 안전합니다.

지원되지 않는 브라우저의 경우 다음 Polyfill을 사용하십시오. https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js

누군가 Polyfill이 Protos를 사용한다고 언급했는데, 나는 그들이 나쁜 연습이라고 말했습니다. 특히 2018 년 솔루션과 같이 잘못 사용되는 경우입니다. 그러나 polyfill은 MDN 설명서에 있으며 더 안전한 초기화 및 실행을 사용합니다. 또한 프로토 타입 덮어 쓰기가 그다지 나쁘지 않은 오래된 브라우저 지원을위한 것입니다.

2020 솔루션 사용 방법 :

const el = document.querySelector(".class");

// Create New Element
const newEl = document.createElement("div");
newEl.id = "foo";

// Insert New Element BEFORE
el.before(newEl);

// Insert New Element AFTER
el.after(newEl);

// Remove Element
el.remove();

// Remove Child
newEl.remove(); // This one wasnt tested but should work