거기에 insertBefore()
자바 스크립트,하지만 내가 어떻게 요소를 삽입 할 수 있습니다 후 jQuery를 또는 다른 라이브러리를 사용하지 않고 다른 요소를?
답변
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
referenceNode
당신이 원하는 노드는 어디에 있습니까 newNode
? 경우 referenceNode
때문에, 괜찮 부모 요소 내의 마지막 아이 인 referenceNode.nextSibling
것 null
및 insertBefore
핸들리스트의 말미에 추가하여 케이스 그게.
그래서:
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;
그리고 모든 것을 실제로 보려면 다음 코드 스 니펫을 실행하십시오.
답변
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 노드 node1
와 node2
,
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