如何在不使用库的情况下在JavaScript中的另一个元素之后插入元素?

Xah*_*Lee 691 javascript dom insert append

insertBefore()JavaScript,但如何不使用jQuery或其他库的情况下另一个元素之后插入元素?

kar*_*m79 1180

referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
Run Code Online (Sandbox Code Playgroud)

referenceNode您想要放置的节点在哪里newNode.如果referenceNode是它的父元素中的最后一个孩子,这很好,因为referenceNode.nextSiblingnullinsertBefore通过添加到列表的最后处理该案件.

所以:

function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
Run Code Online (Sandbox Code Playgroud)

在这里试试吧.

  • 根据[MDN](https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore),如果元素是最后一个(因此nextSibling为null),newNode将按预期追加 (67认同)
  • referenceNode.nextElementSibling是一个更好的选择 (8认同)
  • 感谢一个很好的答案,但是在参数列表中翻转referenceNode和newNode是不是很困惑?为什么不遵循insertBefore语法? (7认同)
  • 如果referenceNode是最后一个子节点,则此代码段不会处理,它应该在appendChild中. (7认同)
  • @BhumiSinghal:错了.`insertBefore()`适用于文本节点.为什么你要`insertAfter()`是不同的?你应该为它创建一个名为`insertBeforeElement()`和`insertAfterElement()`的独立函数. (6认同)
  • 小提琴对我不起作用,这里是代码的 stackblitz,而不是 https://stackblitz.com/edit/js-rshtm2?file=index.js (2认同)
  • 这个答案似乎已经过时了,“insertAdjacentElement”现在看起来是更好的候选者。您能否更新您的帖子以反映这一点?这个答案似乎是最新的:/sf/answers/3504637321/ (2认同)

Arm*_*ndo 94

直截了当的JavaScript将是以下:

追加之前:

element.parentNode.insertBefore(newElement, element);
Run Code Online (Sandbox Code Playgroud)

追加后:

element.parentNode.insertBefore(newElement, element.nextSibling);
Run Code Online (Sandbox Code Playgroud)

但是,在那里折腾一些原型以便于使用

通过构建以下原型,您将能够直接从新创建的元素中调用这些函数.

  • newElement.appendBefore(element);

  • newElement.appendAfter(element);

.appendBefore(element)原型

Element.prototype.appendBefore = function (element) {
  element.parentNode.insertBefore(this, element);
},false;
Run Code Online (Sandbox Code Playgroud)

.appendAfter(element)原型

Element.prototype.appendAfter = function (element) {
  element.parentNode.insertBefore(this, element.nextSibling);
},false;
Run Code Online (Sandbox Code Playgroud)

并且,要查看所有操作,请运行以下代码段

/* 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'));
Run Code Online (Sandbox Code Playgroud)
div {
  text-align: center;
}
#Neighborhood {
  color: brown;
}
#NewElement {
  color: green;
}
Run Code Online (Sandbox Code Playgroud)
<div id="Neighborhood">
  <div id="Neighbor1">Neighbor 1</div>
  <div id="Neighbor2">Neighbor 2</div>
  <div id="Neighbor3">Neighbor 3</div>
</div>
Run Code Online (Sandbox Code Playgroud)

在JSFiddle上运行它

  • _extension_函数名称具有误导性.它认为它应该被称为appendMeBefore和appendMeAfter.我认为它像[appendChild()方法](https://www.w3schools.com/jsref/met_node_appendchild.asp)一样使用,例如`existingElement.appendAfter(newElement);`.看看我在这个更新的[jsfiddle](https://jsfiddle.net/zwm360z2/38/)的意思. (3认同)
  • Append 起作用后,因为如果 element.nextSibling 没有下一个同级,则 nextSibling 为 NULL,然后它将追加到末尾。 (2认同)

Cir*_*四事件 40

insertAdjacentHTML + outerHTML

elementBefore.insertAdjacentHTML('afterEnd', elementAfter.outerHTML)
Run Code Online (Sandbox Code Playgroud)

上升空间:

  • DRYer:您不必将before节点存储在变量中并使用它两次.如果重命名变量,则在较少的情况下进行修改.
  • 高尔夫球比比赛更好insertBefore(即使现有节点变量名称为3个字符长也会中断)

缺点:

  • 更新浏览器支持:https://caniuse.com/#feat=insert-adjacent
  • 将失去元素的属性,例如事件,因为outerHTML将元素转换为字符串.我们需要它,因为insertAdjacentHTML添加来自字符串而不是元素的内容.

  • 如果已经构造了元素,则可以使用`.insertAdjacentElement()` (7认同)
  • 截至2018年,浏览器支持看起来非常可靠:https://caniuse.com/#feat=insert-adjacent (5认同)
  • 这是一个很好的解决方案,我建议大家阅读此http://xahlee.info/js/js_insert_after.html (2认同)

Jam*_*ong 36

快速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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于偶然发现此脚本的人,我不建议使用它.它试图解决@ karim79的原生解决方案已经解决的问题.他的脚本更快更有效 - 我强烈建议使用该脚本而不是这个脚本. (29认同)
  • 作为JavaScript中的一般经验法则,浏览器可以比您编写的任何内容更快地完成任务.虽然这两个解决方案在功能上是相同的,但我的JavaScript解决方案需要在浏览器可以被使用之前被读取,并且每次执行时都需要额外的检查.karim79提供的解决方案将在内部完成所有这些工作,从而节省了这些步骤.这种差异充其量只是微不足道,但他的解决方案更好. (10认同)
  • 换句话说,它试图解决一个不存在的问题.额外检查没有任何内在错误,但我认为它并没有传播对这些方法的最佳理解 (3认同)
  • 差不多.我要离开这里的剧本,因为这是我以前编写的那种东西,但是接受的答案是更好的答案,表明对方法的更好理解并且更快.没有理由使用这个答案 - 我甚至不确定为什么它仍然会得到提升 (3认同)
  • 如果targetElement是它的兄弟中的最后一个元素,那么`targetElement.nextSibling`将返回`null`.当`node.insertBefore`被调用`null`作为它的第二个参数时,它将在集合的末尾添加节点.换句话说,`if(parent.lastchild == targetElement){`分支是多余的,因为`parent.insertBefore(newElement,targetElement.nextSibling);`将正确处理所有情况,即使它最初可能出现.许多人已经在其他评论中指出了这一点. (3认同)

Tay*_*orS 32

2018 年解决方案(不良做法,转到 2020 年)

我知道这个问题很古老,但对于任何未来的用户,这里有一个修改后的原型。这只是不存在的 .insertAfter 函数的 polyfill。这个原型直接将函数添加HTMLElement.insertAfter(element);到 HTMLElement Prototype 中:

// Parent
const el = document.body;
// New Element
const newEl = document.createElement("div");

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

// Insert Before Element
el.insertBefore(newEl)

// Insert After Element
el.insertAfter(newEl);

// Just remember you cant use .insertAfter() or .insertBefore() 
// after either is already called.
// You cant place one element in two places at once.
Run Code Online (Sandbox Code Playgroud)

2019 解决方案(丑陋/过时,转到 2020)

不要使用原型(如 2018 解决方案)。覆盖原型既危险又低质量。如果您想要一个新方法,请改用 Function Overrides。
如果您想要商业项目的安全功能,只需使用默认功能。它不那么漂亮,但它有效:

// Parent
const el = document.body;
// New Element
const newEl = document.createElement("div");

// Function You Need
function insertAfter(el0, el1) {
    el0.parentNode.insertBefore(el1, el0.nextSibling);
}

// Insert Before Element
el.insertBefore(newEl);

// Insert After Element
insertAfter(el, newEl);

// Just remember you cant use insertAfter() or .insertBefore()
// after either is already called.
// You cant place one element in two places at once.
Run Code Online (Sandbox Code Playgroud)

2020 解决方案 - ChildNode

ChildNode 的当前 Web 标准:MDN 文档 - ChildNode

它目前符合生活标准,可以安全使用。

对于不受支持的浏览器(例如 IE),请使用此 Polyfill:https : //github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js

当我说它们是不好的做法时,我意识到 polyfill 使用了 Proto Overrides。它们是,尤其是当它们被盲目使用时,就像我的第一个解决方案一样。但是,MDN 文档中的 polyfill 使用了一种初始化和执行形式,与仅覆盖原型相比,这种形式更加可靠和安全。

如何使用子节点:

// Parent 
const el = document.body;
// New Element
const newEl = document.createElement("div");

// Insert Before Element
el.before(newEl);

// Insert After Element
el.after(newEl);

// Just remember you cant use .after() or .before()
// after either is already called.
// You cant place one element in two places at once.

// Another feature of ChildNode is the .remove() method,
// which deletes the element from the DOM
el.remove();
newEl.remove();
Run Code Online (Sandbox Code Playgroud)

  • MDN 页面上的“before”和“after”不再标记为“实验性”:https://developer.mozilla.org/en-US/docs/Web/API/Element/before https://developer.mozilla .org/en-US/docs/Web/API/Element/after (10认同)
  • @izogfif 嗯,考虑到它刚刚进入生活水平,这是预料之中的。我非常怀疑他们会显着改变方法的行为以适应新标准。如果他们这样做,我将编辑答案。MDN 文档上出现的唯一原因很可能是因为它最近被添加到生活标准中,因此它仍然是“实验性的”,尽管它是稳定的并且在当前版本中 (4认同)
  • 关于“2020 年解决方案”:`before` 和 `after` 在 MDN 页面上都标记为“实验性”:`实验性的。预计未来行为会发生变化。 (2认同)

bit*_*ess 13

虽然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); -->
Run Code Online (Sandbox Code Playgroud)

其他考虑类似用例的人: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

  • 这个答案怎么埋得这么深?我会奖励它一些积分,以引起更多关注。 (4认同)
  • 真的应该给这个答案一些爱,这是即将到来的 2020 年代的现代方法。 (2认同)
  • 我今年见过的最好的 JavaScript 答案之一 (2认同)
  • 这应该是这个问题的公认答案。所有其他响应(包括已接受的答案)都无法显示 html,因此我们可以看到 JavaScript 如何更改 DOM 的可视化表示。 (2认同)

gol*_*pot 11

node1.after(node2)生产<node1/><node2/>,

其中node1和node2是DOM节点.

.after()旧浏览器不支持[1],因此您可能需要应用polyfill.


olv*_*lvl 7

或者你可以简单地做:

referenceNode.parentNode.insertBefore( newNode, referenceNode )
referenceNode.parentNode.insertBefore( referenceNode, newNode )
Run Code Online (Sandbox Code Playgroud)


Pay*_*tta 7

这是我们使用 vanilla javascript 在另一个元素之后添加元素的最简单方法

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('afterend', '<div id="two">two</div>');
Run Code Online (Sandbox Code Playgroud)

参考: https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

  • @MartinJames它实际上确实附加在另一个元素之后。有四种可能的 insertPositions: beforebegin - 在当前节点之前插入元素 beforeend - 将元素追加到当前节点的末尾。因此,begin 之后元素成为当前节点的最后一个子节点 - 将元素添加到当前节点的开头。因此,元素成为当前节点的第一个子节点 afterend - 在当前节点之后插入元素。所以元素成为当前节点的nextSibling (2认同)

Mal*_*lil 5

步骤 1. 准备元素:

var element = document.getElementById('ElementToAppendAfter');
var newElement = document.createElement('div');
var elementParent = element.parentNode;
Run Code Online (Sandbox Code Playgroud)

步骤 2. 在 之后追加:

elementParent.insertBefore(newElement, element.nextSibling);
Run Code Online (Sandbox Code Playgroud)


Ani*_*kai 5

实际上,您可以在较新版本的 Chrome、Firefox 和 Opera 中调用该方法after()。此方法的缺点是 Internet Explorer 尚不支持它。

例子:

// You could create a simple node
var node = document.createElement('p')

// And then get the node where you want to append the created node after
var existingNode = document.getElementById('id_of_the_element')

// Finally you can append the created node to the exisitingNode
existingNode.after(node)
Run Code Online (Sandbox Code Playgroud)

用于测试的简单 HTML 代码是:

// You could create a simple node
var node = document.createElement('p')

// And then get the node where you want to append the created node after
var existingNode = document.getElementById('id_of_the_element')

// Finally you can append the created node to the exisitingNode
existingNode.after(node)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它将向上元素移动到向下元素之后