2

我读过的 jQuery 教程中的几乎所有示例,通常都使用一个主要的公共函数来选择插件。当我说“选择”插件时,我的意思是一个不仅仅是扩展到 jQuery 上的静态函数。

例如:

(function($) {

jQuery.fn.actionList = function(options) {
    var opts = $.extend({}, $.fn.actionList.defaults, options);
    return this.each(function(){
       alert(this);
    });

};

$.fn.actionList.defaults = {
    listHtml: '<div>Set the list html</div>'
};

})(jQuery);

但不是:

jQuery.log = function(message) {
  if(window.console) {
     console.debug(message);
  } else {
     alert(message);
  }
};

这对大多数事情都很好,但我想做的是能够在第一次调用返回的对象上调用第二个函数。

var actionBox = $('actionBox').actionList(options);

//Many light-cycles later

actionBox.refreshData(data);

甚至可能:

$('actionBox').actionList(options);

// laaateerr

$('actionBox').actionList.refreshData(data);

我猜这其中的一个或两个是不可能的,或者至少是不可取的,但我现在才进入 jQuery 和 javascript 的最深层次。

有人可以解释如何做到这一点,或者如果它不可能或不可取,为什么?而他们会做什么呢?

谢谢阅读!

4

2 回答 2

2

我不太确定你在做什么,但你可以对从第一个函数返回的对象调用第二个函数 - 事实上,非常鼓励从你的插件返回一个 jQuery 对象,以及为什么您可以在 jQuery 中链接命令。

使用你的例子

var actionBox = $('actionBox').actionList(options);

//Many light-cycles later

actionBox.refreshData(data);

只要.actionList().refreshData(data)命令都返回一个 jQuery 对象,就可以正常工作。

$('actionBox').actionList.refreshData(data);

需要是

$('actionBox').actionList().refreshData(data);

编辑:

查看 jQuery 源代码,

jQuery.fn = jQuery.prototype = { 
    /* 
        Load of 'property' functions of jQuery object... 
    */ 
}

因此,添加属性(又名插件)来jQuery.fn扩展 jQuery 对象的原型。你打电话时

$(selector, context);

init 使用 jQuery 对象的属性函数返回一个新的 jQuery 对象

jQuery = window.jQuery = window.$ = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context );
},
于 2009-07-01T22:53:32.590 回答
1

我想我有一个可能对你非常有用的插件。它允许您将任何构造函数/对象应用到 jQuery,因为它是它自己的命名空间,并且您可以像通常使用 jQuery 一样使用“this”来引用对象集。使用 this[methodName] 将调用对象上的方法等。

http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.js

一些代码示例在这里:

http://groups.google.com/group/jquery-dev/browse_thread/thread/664cb89b43ccb92c/34f74665423f73c9?lnk=gst&q=structure+plugin+authoring#34f74665423f73c9

它大约在页面的一半处。

希望对你有帮助!

于 2009-07-01T23:05:26.573 回答