更新 如果您需要这种类型的功能,当前的解决方案依赖于这个要点 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
}
}
但上面的代码段不起作用 任何帮助都一如既往地受到赞赏
答案 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);