jQuery .end方法不使用jQuery对象

Die*_*ego 2 jquery jquery-plugins jquery-end

我有一个非常简单的自定义插件.如果它this在调用后返回,.end()效果很好.但是如果它返回$(this),.end()则不起作用.为什么会这样?我在这里错过了什么吗?

代码:

$.fn.fnBar = function() {
    $(this).html("hello!");
    //return $(this); // Doesn't work
    return this; // Works!
};


$("div")
    .find("span")
        .fnBar()
    .end()
    .css("color", "red");
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 5

从文档:

结束当前链中最近的过滤操作,并将匹配元素集返回到先前的状态.

$("div").find("span").fnBar().end()
Run Code Online (Sandbox Code Playgroud)

end将过滤的状态设置为调用之前的过滤状态find.

只是$(this),你正在重建一个新的jQuery对象,没有任何历史记录.您没有过滤操作也没有链,因此没有任何内容可以取消.

jQuery end函数实现如下:

end: function() {
    return this.prevObject || this.constructor(null);
},
Run Code Online (Sandbox Code Playgroud)

这意味着您可以通过记录prevObjectjQuery对象的属性来查看差异:

console.log(this.prevObject);
console.log($(this).prevObject); // will give undefined
Run Code Online (Sandbox Code Playgroud)