Как вставить элемент после другого элемента в JavaScript без использования библиотеки?

Там insertBefore() в JavaScript, но как я могу вставить элемент после другого элемента без использования jQuery или другой библиотеки?

Ответ 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 году, и теперь все может быть иначе. Поэтому решите свое.

JavaScript DOM insertAfter() method @jsfiddle.net

Ответ 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>

Ответ 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
    );
  };
}