javascript insertAfter 替代 nextSibling hack? [复制]

Posted

技术标签:

【中文标题】javascript insertAfter 替代 nextSibling hack? [复制]【英文标题】:javascript insertAfter alternatives to nextSibling hack? [duplicate] 【发布时间】:2013-05-25 02:23:46 【问题描述】:

我有以下代码:

<div id="container">
<div id="cat1"></div>
<div id="cat2"></div>
<div id="cat3"></div>
</div>

我可以做一个 insertBefore 但没有 insertAfter... 如果我想将另一只猫附加到容器中怎么办?我真的必须使用 nextSibling 吗?很奇怪,有一个 insertBefore 和一个 insertAfter 必须使用 hack。有没有替代品

function insertAfter(referenceNode, newNode) 
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);

insertAfter(document.getElementById("tres"), myscript);

【问题讨论】:

不,你拥有的真的很好。 你可以做parent.insertBefore(new, old); parent.insertBefore(old, new); 这将通过交换来模拟insertAfter @Bergi 我也发现了这一点,但从技术上讲,OP 正在询问是否有比该问题的答案更好的东西。 @ajp15243:显然不是,否则它将成为那里的最佳答案 :-) 基本上这是同一个问题,要求“最佳方式”。 我有一个替代方法,它不是很好,并且添加了垃圾,添加一个id为containerEnd的div并执行insertBefore(elem,containerEnd)。这是另一种选择,但不是更好的选择。 【参考方案1】:

由于您可以组合insertBeforenextSibling,因此不需要其他功能。如果第二个参数为空,insertBefore 的行为类似于 appendChild 的额外好处。

你可以像这样扩展原型链来实现insertAfter

Node.prototype.insertAfter = function(n,r) this.insertBefore(n,r.nextSibling);;

这将允许您调用:

someContainer.insertAfter(newNode, someReference);

请注意,旧版本的 IE 不喜欢你 messing with the prototype of built-in objects。

【讨论】:

你可能想使用r ? r.nextSibling : this.firstChild :-) 确实,我将不得不这样做,因为我要一个接一个地添加数百张幻灯片。我什至考虑过添加一个 DOM 元素并执行 然后使用 insertBefore(newdiv,containerEnd);用起来感觉自然一点,但是加了垃圾,很奇怪。那就是想要insertAfter,必须使用insertBefore。 等等...你想把它添加为最后一个元素吗? appendChild 怎么了? 我实际上是在没有确切顺序的情况下添加的,但是在加载时我是一个接一个地装载它们。【参考方案2】:

您可以使用以下功能代替您将获得解决方案的方法。

    function insertAfter(referenceNode, newNode)    
newNode.insertBefore(referenceNode.next());

【讨论】:

这个next()方法是什么?

以上是关于javascript insertAfter 替代 nextSibling hack? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript insertAfter

JavaScript insertAfter DOM的函数

JavaScript实现JQuery的insertAfter功能

jQuery 文档操作 - insertAfter() ,insertBefore() 方法

jQuery 文档操作 - insertAfter() ,insertBefore(),after(),before() 方法

JS编程练习:封装insertAfter函数(功能类似于系统insertBefor)