【问题标题】:Behaviour of .end() when used with .before().end() 与 .before() 一起使用时的行为
【发布时间】: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


【解决方案1】:

jQuery v1.7.2 使用 pushStack 构建新的 DOM 元素。

pushStack 将项目添加到 jQuery 对象的堆栈中(看图!),end 弹出最后一个,返回堆栈的其余部分(无论剩下什么)。


jQuery v1.7.2 line #5860:
注解我的

before: function() {
    if ( this[0] && this[0].parentNode ) {
        return this.domManip(arguments, false, function( elem ) {
            this.parentNode.insertBefore( elem, this );
        });
    } else if ( arguments.length ) {
        var set = jQuery.clean( arguments );
        set.push.apply( set, this.toArray() ); 
        return this.pushStack( set, "before", arguments ); //pushStack in use
    }
}

【讨论】:

  • 谢谢,这解释了“如何”。所以实际上问题更大,因为依赖于堆栈的 any 函数在两种情况下的行为不同,例如jsfiddle.net/R2uc7/4。这种行为可靠吗?好像有点奇怪。
  • @pimvdb,“这似乎有点奇怪”请记住 jQuery 是由人编写的,他们有时会犯错误。很难说这种行为是故意的,还是只是一种极端情况。
  • @zzzzBov:我明白 :) 只是很难调试这个。无论如何,我没有考虑到 jQuery 集合和实际兄弟姐妹之间的差异,这导致了混淆。感谢您的帮助:)
  • File a bug on the jQuery website。他们很乐意听到真正的错误,如果这是设计使然的话,您也很乐意直接听到他们的消息。
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2021-07-30
  • 2011-03-18
  • 2020-06-05
  • 2015-08-31
  • 2018-02-02
  • 2021-09-05
相关资源
最近更新 更多