Там insertBefore()
в JavaScript, но как я могу вставить элемент после другого элемента без использования jQuery или другой библиотеки?
Как вставить элемент после другого элемента в JavaScript без использования библиотеки?
Ответ 1
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
Где referenceNode
- это node, который вы хотите поместить newNode
после. Если referenceNode
является последним дочерним элементом в его родительском элементе, это прекрасно, потому что referenceNode.nextSibling
будет null
и insertBefore
обрабатывает это, добавив в конец списка.
Итак:
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
Ответ 2
Простой JavaScript будет следующим:
Добавить до:
element.parentNode.insertBefore(newElement, element);
Добавить после:
element.parentNode.insertBefore(newElement, element.nextSibling);
Но, запустите некоторые прототипы там для простоты использования
Создав следующие прототипы, вы сможете вызвать эту функцию непосредственно из вновь созданных элементов.
-
newElement.appendBefore(element);
-
newElement.appendAfter(element);
.appendBefore(element) Prototype
Element.prototype.appendBefore = function (element) {
element.parentNode.insertBefore(this, element);
},false;
.appendAfter(element) Prototype
Element.prototype.appendAfter = function (element) {
element.parentNode.insertBefore(this, element.nextSibling);
},false;
И, чтобы увидеть все в действии, выполните следующий фрагмент кода
/* Adds Element BEFORE NeighborElement */
Element.prototype.appendBefore = function(element) {
element.parentNode.insertBefore(this, element);
}, false;
/* Adds Element AFTER NeighborElement */
Element.prototype.appendAfter = function(element) {
element.parentNode.insertBefore(this, element.nextSibling);
}, false;
/* Typical Creation and Setup A New Orphaned Element Object */
var NewElement = document.createElement('div');
NewElement.innerHTML = 'New Element';
NewElement.id = 'NewElement';
/* Add NewElement BEFORE -OR- AFTER Using the Aforementioned Prototypes */
NewElement.appendAfter(document.getElementById('Neighbor2'));
div {
text-align: center;
}
#Neighborhood {
color: brown;
}
#NewElement {
color: green;
}
<div id="Neighborhood">
<div id="Neighbor1">Neighbor 1</div>
<div id="Neighbor2">Neighbor 2</div>
<div id="Neighbor3">Neighbor 3</div>
</div>
Ответ 3
insertAdjacentHTML
+ outerHTML
elementBefore.insertAdjacentHTML('afterEnd', elementAfter.outerHTML)
расквитаться:
- DRYer: вам не нужно хранить предыдущий узел в переменной и использовать его дважды. Если вы переименуете переменную, то при меньшем появлении для изменения.
- гольф лучше, чем
insertBefore
(перерыв, даже если существующее имя переменной узла составляет 3 символа)
Недостатки:
- более низкая поддержка браузера: более поздняя: https://caniuse.com/#feat=insert-adjacent
- потеряет свойства элемента, такие как события, потому что
outerHTML
преобразует элемент в строку. Нам это нужно, потому чтоinsertAdjacentHTML
добавляет контент из строк, а не элементов.
Ответ 4
Быстрый поиск в Google показывает этот script
// 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 next sibling.
parent.insertBefore(newElement, targetElement.nextSibling);
}
}
Ответ 5
Хотя 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
Ответ 6
node1.after(node2)
производит <node1/><node2/>
,
где node1 и node2 являются узлами DOM.
.after()
не поддерживается в старых браузерах [1], поэтому вам может потребоваться применить полифилл.
Ссылка:https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/after
Ответ 7
Или вы можете просто сделать:
referenceNode.parentNode.insertBefore( newNode, referenceNode )
referenceNode.parentNode.insertBefore( referenceNode, newNode )
Ответ 8
Шаг 1. Подготовьте элементы:
var element = document.getElementById('ElementToAppendAfter');
var newElement = document.createElement('div');
var elementParent = element.parentNode;
Шаг 2. Добавить после:
elementParent.insertBefore(newElement, element.nextSibling);
Ответ 9
insertBefore() используется как parentNode.insertBefore()
.
Чтобы подражать этому и сделать метод parentNode.insertAfter()
, мы можем написать следующий код.
JavaScript
Node.prototype.insertAfter = function(newNode, referenceNode) {
return referenceNode.parentNode.insertBefore(
newNode, referenceNode.nextSibling); // based on karim79 solution
};
// getting required handles
var refElem = document.getElementById("pTwo");
var parent = refElem.parentNode;
// creating <p>paragraph three</p>
var txt = document.createTextNode("paragraph three");
var paragraph = document.createElement("p");
paragraph.appendChild(txt);
// now we can call it the same way as insertBefore()
parent.insertAfter(paragraph, refElem);
HTML
<div id="divOne">
<p id="pOne">paragraph one</p>
<p id="pTwo">paragraph two</p>
</div>
Обратите внимание, что расширение DOM может быть не лучшим решением для вас, как указано в этой статье.
Hovewer, эта статья была написана в 2010 году, и теперь все может быть иначе. Поэтому решите свое.
Ответ 10
Великий Дастин Диас написал об этом в своем посте, анализируя его и предлагая код в первом ответе с небольшими изменениями:
function insertAfter(parent, node, referenceNode) {
parent.insertBefore(node, referenceNode.nextSibling);
}
Ответ 11
В идеале insertAfter
должен работать подобно insertBefore. В приведенном ниже коде будет выполняться следующее:
- Если детей нет, добавляется новый
Node
- Если нет ссылки
Node
, добавляется новыйNode
- Если после ссылки
Node
нетNode
, добавляется новыйNode
- Если ссылка
Node
имеет потомков, то новыйNode
вставлен перед этим сиблингом - Возвращает новый
Node
Расширение Node
Node.prototype.insertAfter = function(node, referenceNode) {
if (node)
this.insertBefore(node, referenceNode && referenceNode.nextSibling);
return node;
};
Один общий пример
node.parentNode.insertAfter(newNode, node);
См. код
// First extend
Node.prototype.insertAfter = function(node, referenceNode) {
if (node)
this.insertBefore(node, referenceNode && referenceNode.nextSibling);
return node;
};
var referenceNode,
newNode;
newNode = document.createElement('li')
newNode.innerText = 'First new item';
newNode.style.color = '#FF0000';
document.getElementById('no-children').insertAfter(newNode);
newNode = document.createElement('li');
newNode.innerText = 'Second new item';
newNode.style.color = '#FF0000';
document.getElementById('no-reference-node').insertAfter(newNode);
referenceNode = document.getElementById('no-sibling-after');
newNode = document.createElement('li');
newNode.innerText = 'Third new item';
newNode.style.color = '#FF0000';
referenceNode.parentNode.insertAfter(newNode, referenceNode);
referenceNode = document.getElementById('sibling-after');
newNode = document.createElement('li');
newNode.innerText = 'Fourth new item';
newNode.style.color = '#FF0000';
referenceNode.parentNode.insertAfter(newNode, referenceNode);
<h5>No children</h5>
<ul id="no-children"></ul>
<h5>No reference node</h5>
<ul id="no-reference-node">
<li>First item</li>
</ul>
<h5>No sibling after</h5>
<ul>
<li id="no-sibling-after">First item</li>
</ul>
<h5>Sibling after</h5>
<ul>
<li id="sibling-after">First item</li>
<li>Third item</li>
</ul>
Ответ 12
Этот код предназначен для вставки элемента ссылки сразу после последнего существующего дочернего элемента в вложение небольшого файла css
var raf, cb=function(){
//create newnode
var link=document.createElement('link');
link.rel='stylesheet';link.type='text/css';link.href='css/style.css';
//insert after the lastnode
var nodes=document.getElementsByTagName('link'); //existing nodes
var lastnode=document.getElementsByTagName('link')[nodes.length-1];
lastnode.parentNode.insertBefore(link, lastnode.nextSibling);
};
//check before insert
try {
raf=requestAnimationFrame||
mozRequestAnimationFrame||
webkitRequestAnimationFrame||
msRequestAnimationFrame;
}
catch(err){
raf=false;
}
if (raf)raf(cb); else window.addEventListener('load',cb);
Ответ 13
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
function createDiv(){
var newDiv = document.createElement("div");
var txt = document.createTextNode("I'm the second div");
newDiv.appendChild(txt);
var x = document.getElementsByTagName("BODY")[0];
x.insertBefore(newDiv, third);
}
</script>
</head>
<body>
<div class="first">
<p>
I'm the first div
</p>
</div>
<div id="third">
<p>
I'm the third div
</p>
</div>
<button type= " button " name= " button " onclick = " createDiv() " >
Create the second Div
</button>
</body>
</html>
Ответ 14
Вы можете использовать функцию appendChild
для вставки после элемента.
Ссылка: http://www.w3schools.com/jsref/met_node_appendchild.asp
Ответ 15
надежная реализация insertAfter.
// source: https://github.com/jserz/domPlus/blob/master/src/insertAfter()/insertAfter.js
Node.prototype.insertAfter = Node.prototype.insertAfter || function (newNode, referenceNode) {
function isNode(node) {
return node instanceof Node;
}
if(arguments.length < 2){
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': 2 arguments required, but only "+ arguments.length +" present."));
}
if(isNode(newNode)){
if(referenceNode === null || referenceNode === undefined){
return this.insertBefore(newNode, referenceNode);
}
if(isNode(referenceNode)){
return this.insertBefore(newNode, referenceNode.nextSibling);
}
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': parameter 2 is not of type 'Node'."));
}
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': parameter 1 is not of type 'Node'."));
};
Ответ 16
Позволяет обрабатывать все сценарии
function insertAfter(newNode, referenceNode) {
if(referenceNode && referenceNode.nextSibling && referenceNode.nextSibling.nodeName == '#text')
referenceNode = referenceNode.nextSibling;
if(!referenceNode)
document.body.appendChild(newNode);
else if(!referenceNode.nextSibling)
document.body.appendChild(newNode);
else
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
Ответ 17
if( !Element.prototype.insertAfter ) {
Element.prototype.insertAfter = function(item, reference) {
if( reference.nextSibling )
reference.parentNode.insertBefore(item, reference.nextSibling);
else
reference.parentNode.appendChild(item);
};
}
Ответ 18
Я знаю, что этот вопрос уже слишком много ответов, но никто из них не выполнил мои точные требования.
Мне нужна функция, которая имеет совершенно противоположное поведение parentNode.insertBefore
- то есть она должна принимать нулевой referenceNode
(который не принимается в ответ) и где insertBefore
будет вставлять в конец insertBefore
которые он должен вставить в начале, так как в противном случае вообще не было бы возможности вставить в исходное местоположение с этой функцией; по той же причине insertBefore
вставляет в конце.
Поскольку нулевой referenceNode
требует, чтобы вы insertBefore
родителя, нам нужно знать родительский - insertBefore
- это метод parentNode
, поэтому он имеет доступ к родительскому parentNode
таким образом; нашей функции нет, поэтому нам нужно передать родительский элемент в качестве параметра.
Полученная функция выглядит так:
function insertAfter(parentNode, newNode, referenceNode) {
parentNode.insertBefore(
newNode,
referenceNode ? referenceNode.nextSibling : parentNode.firstChild
);
}
Или (если это необходимо, я не рекомендую), вы можете, конечно, улучшить прототип Node
:
if (! Node.prototype.insertAfter) {
Node.prototype.insertAfter = function(newNode, referenceNode) {
this.insertBefore(
newNode,
referenceNode ? referenceNode.nextSibling : this.firstChild
);
};
}