Javascript 重写jQuery.end()方法以接受参数
更新 当前的解决方案基于这一要点,以防您需要此类功能 我正在做一个小实验,尝试用我自己的方法覆盖jQuery的核心端方法,该方法本质上只是为jQuery添加了功能 例如,如果您正在使用jQuery,您可能会执行以下操作Javascript 重写jQuery.end()方法以接受参数,javascript,jquery,Javascript,Jquery,更新 当前的解决方案基于这一要点,以防您需要此类功能 我正在做一个小实验,尝试用我自己的方法覆盖jQuery的核心端方法,该方法本质上只是为jQuery添加了功能 例如,如果您正在使用jQuery,您可能会执行以下操作 $('h1.clickme').click(function () { $(this).next('div').css("width", "+=200").parent().next().hide().end().end() //this should t
$('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
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
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
}
}
我希望通过添加添加数字参数的功能来覆盖jQuery end方法
比如说
.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);
}
}
}
})()
所以我可以称之为这样的事情
$('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
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
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
}
}
但显然,我不认为写出所有这些if语句是有效的
有没有更简单的方法?我确信性能差不多,但为了可读性,我做得更多
我考虑根据传递的参数将prevObject字符串附加到prevObject变量中,如下所示
$('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
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
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
}
}
但是上面的代码片段不起作用
我们将一如既往地感谢您的帮助这应该可以做到:
var prevObject = this.prevObject;
for(i = 1; i<no_of_times; i++) {
prevObject = prevObject.prevObject;
if(!prevObject) {
prevObject = this.constructor(null);
break
}
}
只需在循环的每次迭代中获取prevObject的prevObject,直到找不到prevObject为止。这应该可以做到:
var prevObject = this.prevObject;
for(i = 1; i<no_of_times; i++) {
prevObject = prevObject.prevObject;
if(!prevObject) {
prevObject = this.constructor(null);
break
}
}
只需在循环的每次迭代中获取prevObject的prevObject,直到找不到prevObject为止。类似的方法应该可以工作
var prevObject = this.prevObject;
for(i = 0; i<no_of_times; i++) {
prevObject = prevObject.prevObject;
}
return prevObject || this.constructor(null);
类似的方法应该会奏效
var prevObject = this.prevObject;
for(i = 0; i<no_of_times; i++) {
prevObject = prevObject.prevObject;
}
return prevObject || this.constructor(null);
您可以重新使用要重写的旧方法:
(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);
您可以重新使用要重写的旧方法:
(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);
以下是我的解决方案:
您不必重新实现任何逻辑或跟踪以前的元素:
(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);
以下是我的解决方案:
您不必重新实现任何逻辑或跟踪以前的元素:
(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);
仔细的我很确定,prevObject不是一个文档化的特性。为什么不缓存原始文件。以不同的名称结束,然后调用它?或者更好,为你的自定义方法使用一个不同的名称。同意-没有理由重写。如果插件和新方法可以的话结束。是的,你可能是对的-我只是想我正在向它添加功能,而不是真的重写它,所以无论你是否添加了参数,它都会以同样的方式工作。。。我很确定,prevObject不是一个文档化的特性。为什么不缓存原始文件。以不同的名称结束,然后调用它?或者更好,为您的自定义方法使用不同的名称。同意-没有理由重写。如果插件和新方法可以,则结束。是的,您可能是对的-我只是在想我正在向它添加功能,而不是真正重写它,所以无论您是否添加了参数Hanks Elliot,它都会以相同的方式工作-我知道我是缺少一些小的意义只是存储这个。prevObject在变量中是最好的解决方案感谢Elliot的工作-我知道我缺少一些小的意义只是存储这个。prevObject在变量中是最好的解决方案感谢答案-它非常接近Elliot的版本,但可读性更简单,我一直很欣赏因此,我给出了答案——它与埃利奥特的版本非常接近,但可读性更简单,这一点我一直很欣赏,所以我给出了非常酷的区域,我甚至没有想过这样做;非常好-我在这里稍微整理了一下你的语法非常酷的gion,我甚至没有想过要这样做;非常好-我在这里稍微整理了一下你的语法