【发布时间】:2012-07-17 17:40:58
【问题描述】:
当对从 DOM 分离的元素调用 .before 时,.end 的行为与对附加元素的行为不同:
var $div1 = $("div");
console.log($div1.after("foo").end()); // [document]
$div1.detach();
console.log($div1.after("foo").end()); // [<div></div>]
(小提琴:http://jsfiddle.net/R2uc7/2/)
显然,.before 会导致与.end 不同的行为,具体取决于附加或分离的节点。我没有看到逻辑,我不确定我可以依赖什么。
有人能告诉我.end 和.before 的定义行为吗?
【问题讨论】:
-
你不能在 dom 中没有的东西之前插入一些东西。我很惊讶它甚至可以做任何事情,dom equivalent 会默默地失败。
-
@Esailija “从 jQuery 1.4 开始,.before() 和 .after() 也可以在断开连接的 DOM 节点上工作。”。
-
@meze 以某种骇人听闻的方式它们确实可以工作,是的,这些元素仍然彼此完全断开连接,并且只会给人一种工作的错觉,因为它们恰好被同一个 jQuery 对象包装。之前或之后实际上没有插入任何内容。
-
@meze:就我而言,他并没有说错什么。我想我明白了 - 使用分离的节点,只有集合被更改,
.filter查看新堆栈以便工作。.siblings不看堆栈,而是看树。这个失败是因为没有父节点,所以不能有“兄弟姐妹”的概念。 -
@meze:隐含地这样做了:
.end只是弹出堆栈。由于.before仅更改分离节点的堆栈,因此.end在这种情况下从堆栈中弹出一个与附加节点不同的项。
标签: detach jquery jquery-end