我正在尝试修改.offset()
,以便它永远不会返回undefined
,即隐身/隐藏元素。
我遇到的问题是,我不知道如何正确地将this
传递给原始方法,说实话。断点调试显示,当它应该是有问题的元素时,我会不断获得Window
。这就是我得到的:
(function( $ ){
var original = $.fn.offset;
$.fn.offset = function( elem, coordinates, pass ) {
console.log('step 1'); // successful.
console.log(this); // element confirmation.
var o = original(elem, coordinates, pass); // triggers an exception.
console.log('step 2'); // is never reached.
if (o === undefined ) {
console.log('step 3a');
return {};
}
else {
console.log('step 3b');
return o;
}
}
}( jQuery ));
[…]
$('#element').offset(); // method call.
这是例外:
Error in event handler for (unknown): TypeError: undefined is not a function
at jQuery.fn.extend.offset (chrome-extension://…/js/jquery-1.11.0.js:10109:10)
at $.fn.offset (chrome-extension://…/js/jquery-modifications.js:35:11)
我尝试了不同的变体 - original(arguments)
,this.original()
,original(this, …)
- 但都没有效果。在this question中,在另外三个参数旁边使用了一个名为elem
的参数 - 但我不确定为什么。是因为API提及attributeName
,value
还有回调函数?如果是这样,那么我的尝试应该有效,类似于.offset()
API。查看jQuery定义这些函数的方式也无济于事,因为.fn.attr
甚至没有像.fn.offset
那样显示。
答案 0 :(得分:4)
正如你所说:
我所遇到的问题是,我不知道如何正确地将其传递给原始方法,说实话。
为了改变功能范围(this),有两个Function Prototype方法,名为call()
和apply()
参考这两种方法的文件:
所以,你的代码现在应该是这样的:
var original = $.fn.offset;
$.fn.offset = function() {
var o = original.apply(this, arguments);
return typeof o === 'undefined' ? {} : o;
};
和
return typeof o === 'undefined' ? {} : o;
它只是一个更好的(IMO)更短的版本:
if (typeof o === 'undefined') {
return {};
} else {
return o;
}