扩展jQuery方法时如何传递参数?

时间:2015-04-04 12:12:16

标签: javascript jquery offset extend argument-passing

我正在尝试修改.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提及attributeNamevalue还有回调函数?如果是这样,那么我的尝试应该有效,类似于.offset() API。查看jQuery定义这些函数的方式也无济于事,因为.fn.attr甚至没有像.fn.offset那样显示。

1 个答案:

答案 0 :(得分:4)

正如你所说:

  

我所遇到的问题是,我不知道如何正确地将其传递给原始方法,说实话。

为了改变功能范围(this),有两个Function Prototype方法,名为call()apply()

参考这两种方法的文件:

Function.prototype.call()

Function.prototype.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;
}