我读过的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的最深层次。
有人可以解释如何做到这一点,或者如果不可能或不可取,为什么?他们会做什么呢?
感谢阅读!
答案 0 :(得分: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
添加属性(a.k.a插件)扩展了jQuery对象的原型。当你打电话
$(selector, context);
使用jQuery对象的init
属性函数返回一个新的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 );
},
答案 1 :(得分:1)
我想我有一个可能对你非常有用的插件。它允许您将任何构造函数/对象应用于jQuery,因为它是自己的命名空间。您可以像使用jQuery一样使用'this'来引用对象集。使用此[methodName]将在对象上调用方法等。
http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.js
有些代码示例在这里:
大约是页面的一半。
我希望你觉得它很有用!