覆盖jQuery .end()方法来接受参数

时间:2013-05-14 21:43:55

标签: javascript jquery

更新 如果您需要这种类型的功能,当前的解决方案依赖于这个要点 https://gist.github.com/jdaly13/5581538#file-gistfile1-js

我正在尝试一些实验,我试图用我自己的方法覆盖jQuery的核心结束方法,这实际上只是为它添加了功能

例如,如果你正在使用jQuery,你可能会做这样的事情

$('h1.clickme').click(function () {
     $(this).next('div').css("width", "+=200").parent().next().hide().end().end()
      //this should traverse you back to the div after the h1 clicked
})

我想通过添加添加数字参数的功能来覆盖jQuery结束方法 例如

.end(1) 

会和

一样
.end().end()

这是我到目前为止所拥有的

(function(){

// Define overriding method.
jQuery.fn.end = function(no_of_times){
    var prevObject = "prevObject";
    if (!(arguments.length) || (typeof no_of_times !== "number")) {
        return this.prevObject || this.constructor(null);
    } else {
        if (no_of_times == 1) {
            return this.prevObject.prevObject || this.constructor(null)
        } else if (no_of_times == 2) {
            return this.prevObject.prevObject.prevObject || this.constructor(null)  
        } else if (no_of_times == 3) {
            return this.prevObject.prevObject.prevObject.prevObject || this.constructor(null)
        } else {
            //too many times can't type anymore
            return this.prevObject || this.constructor(null);
        }           
    }

}
})()

所以我可以这样打电话

$('.promo-carousel').parent().prev().siblings('span').hide().end(2)

但显然我不认为写出所有if语句是有效的 有更简单的方法吗?我确信性能大致相同,但为了便于阅读,我这样做更多

我想过将prevObject变量附加到“prevObject”字符串,基于传递类似的参数

if (!(arguments.length) || (typeof no_of_times !== "number")) {
            return this.prevObject || this.constructor(null);
        } else {
            for (i=0; i <= no_of_times; i++) {
                pObj += "prevObject."           
            }
            var prevObject = pObj.slice(0, prevObject.length -1)
            console.log(prevObject);
            return this.prevObject
        }

    }

但上面的代码段不起作用 任何帮助都一如既往地受到赞赏

4 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

var prevObject = this.prevObject;

for(i = 1; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
    if(!prevObject) {
        prevObject = this.constructor(null);
        break
    }
}

只需获得循环每次迭代prevObject的{​​{1}},直到找不到prevObject

答案 1 :(得分:1)

类似的东西应该有用。

var prevObject = this.prevObject;
for(i = 0; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
}
return prevObject || this.constructor(null);

答案 2 :(得分:1)

这是我的解决方案:http://jsfiddle.net/QVxqY/
您不必重新实现任何逻辑或跟踪以前的元素:

(function($){
    var originalEnd = $.fn.end;
    $.fn.end = function(n){
        if(!n)
            return originalEnd.call(this);
        return $.fn.end.call(originalEnd.call(this), n-1);
    }
})(jQuery);

答案 3 :(得分:0)

您可以重复使用覆盖的旧方法:

(function($){
    var oldfn = $.fn.end;
    $.fn.end = function(times){
        times = times || 1; // default to 1 if nothing or 0 is passed in
        var ret = this;
        for (i=0;i<times;i++) {
            ret = oldfn.call(ret);
        }
        return ret;
    };
})(jQuery);