使用.proxy()调用插件方法

时间:2011-10-11 14:45:28

标签: jquery jquery-plugins

我正在尝试在jquery插件中使用.proxy()方法。不知道发生了什么,但它不是在调用methods.strobe。我有以下示例代码:

(function($) {
    var settings = {
    }


    var methods = {
        init: function(options) {
            alert('init fired');
            $.proxy(methods.strobe,this);
            return this;

        },
        destroy: function() {
        },
        strobe: function(){
            alert('strobe fired');
        },
        show: function() {},
        hide: function() {},
        refresh: function() {}
    };

      $.fn.notify = function(method) {
          if (methods[method]) {
              return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
          } else if (typeof method === 'object' || !method) {
              return methods.init.apply(this, arguments);
          } else {
              $.error('Method ' + method + ' does not exist on jQuery.notify');
          }
      };
 })(jQuery);

$().notify();

我有这个jsfiddle进行测试:http://jsfiddle.net/CZqFW/

任何输入都将不胜感激。

2 个答案:

答案 0 :(得分:6)

jQuery proxy()返回一个函数,该函数用第二个上下文关闭第一个参数。

您可以调用返回的函数,它将立即执行。

$.proxy(methods.strobe,this)();

这为您提供的唯一内容是替换this的{​​{1}}上下文。您可以使用javascript的methods.strobe()函数来完成同样的事情:

call()

您的jQuery插件已将methods.strobe.call(this); 设置为$ .fn.notify上的方法。所以你也可以这样称呼它:

strobe()

答案 1 :(得分:4)

$.proxy(methods.strobe,this);

返回一个调用strobe方法但始终绑定到this的新函数。它实际上并不调用scrobe函数。所以,你需要做的是实际调用该函数:

var strobe = $.proxy(methods.strobe,this);
strobe();