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

IT技术 javascript dom insert append
2021-01-29 05:22:36

还有insertBefore()在JavaScript,但我怎么能插入一个元素后,另一种元素,而不使用jQuery或其他库?

6个回答
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);

referenceNode您要放置的节点在哪里newNodeIfreferenceNode是其父元素中的最后一个子元素,这很好,因为referenceNode.nextSiblingwill 是nullinsertBefore通过添加到列表的末尾来处理这种情况。

所以:

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>

感谢您提供一个很好的答案,但是在参数列表中翻转 referenceNode 和 newNode 是不是很混乱?为什么不遵守 insertBefore 语法?
2021-03-15 05:22:36
如果referenceNode 是最后一个子节点,则此代码段不处理,它应该在其中附加子节点。
2021-03-15 05:22:36
referenceNode.nextElementSibling 是更好的选择
2021-03-16 05:22:36
根据MDN,如果元素是最后一个(因此 nextSibling 为空),则 newNode 将按预期附加
2021-03-22 05:22:36
@BhumiSinghal:错了。insertBefore()适用于文本节点。你为什么想要insertAfter()与众不同?您应该为此创建一对单独的名为insertBeforeElement()and的函数insertAfterElement()
2021-03-29 05:22:36

简单的 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 上运行它

我在 jslint 中收到警告:预期的 ';' 而是看到了“,”。}, 错误的;
2021-03-17 05:22:36
Append After 有效,因为如果 element.nextSibling 没有下一个兄弟,nextSibling 为 NULL,然后它会追加到最后。
2021-03-25 05:22:36
扩展功能名称误导。它认为它应该被称为 appendMeBefore 和 appendMeAfter。我认为它像appendChild() 方法一样使用,例如existingElement.appendAfter(newElement);看看我在这个更新的jsfiddle 中的意思
2021-04-07 05:22:36

尽管insertBefore()很棒并且被这里的大多数答案引用。为了增加灵活性,并且更明确一点,您可以使用:

所述insertAdjacentElement()refElem.insertAdjacentElement(position, newElem)让你引用任何元件,和插入件的确切位置要所述待移动的元件(位置能够是以下之一:'beforebegin''afterbegin''beforeend''afterend'),如下所示:

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

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

真的应该给这个答案一些爱,这是 2020 年代的现代方法正在迅速临近。
2021-03-17 05:22:36
一个小小的旁注,它不适用于文档片段。
2021-03-19 05:22:36
这个答案怎么埋得这么深?我会奖励它一些点,以引起更多的关注。
2021-04-05 05:22:36

insertAdjacentHTML + outerHTML

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

优点:

  • DRYer:您不必将 before 节点存储在变量中并使用它两次。如果您重命名变量,则修改的次数较少。
  • 打高尔夫球比insertBefore(即使现有节点变量名称为 3 个字符长,也能实现)

缺点:

  • 较新的浏览器支持较低:https : //caniuse.com/#feat=insert-adjacent
  • 将丢失元素的属性,例如事件,因为outerHTML将元素转换为字符串。我们需要它是因为insertAdjacentHTML从字符串而不是元素添加内容。
截至 2018 年,浏览器支持看起来非常稳定:caniuse.com/#feat=insert-adjacent
2021-03-14 05:22:36
如果您已经构建了元素,则可以使用 .insertAdjacentElement()
2021-03-28 05:22:36
这是一个很好的解决方案,我建议大家阅读这个xahlee.info/js/js_insert_after.html
2021-04-06 05:22:36

一个快速的谷歌搜索揭示了这个脚本

// 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);
    }
}
如果 targetElement 是其同级中的最后一个元素,targetElement.nextSibling则将返回null. node.insertBefore被调用,null因为它的第二个参数,那么它将在集合的末尾添加节点。换句话说,if(parent.lastchild == targetElement) {分支是多余的,因为parent.insertBefore(newElement, targetElement.nextSibling);它可以正确处理所有情况,即使它起初可能看起来不一样。许多人已经在其他评论中指出了这一点。
2021-03-12 05:22:36
作为 JavaScript 中的一般经验法则,浏览器可以比您编写的任何东西都更快地完成任务。尽管这两种解决方案在功能上是相同的,但我的 JavaScript 解决方案需要在浏览器理解之前阅读它才能使用,并且每次执行时都需要额外检查。karim79 提供的解决方案将在内部完成所有这些,从而节省了这些步骤。差异充其量只是微不足道的,但他的解决方案是更好的解决方案。
2021-03-13 05:22:36
对于偶然发现此脚本的任何人,我不建议使用它。它试图解决@karim79 的原生解决方案已经解决的问题。他的脚本更快、更高效——我强烈建议使用该脚本而不是这个脚本。
2021-03-18 05:22:36
差不多。我将脚本留在这里是因为它是我以前写的那种东西,但接受的答案是更好的答案,显示出对方法的更好理解并且速度更快。没有理由改用这个答案 - 我什至不知道为什么它仍然得到赞成
2021-03-28 05:22:36
换句话说,它试图解决一个不存在的问题。额外检查本身并没有错,但我认为它并没有传播对这些方法的最佳理解
2021-04-05 05:22:36