我爱jQuery插件体系结构,但是,我觉得很沮丧(可能是由于我的一部分缺乏了解)时,我想保留的插件实例的引用稍后访问我的代码属性或方法。
编辑:我要澄清的是什么,我真正想要做的是保留该插件中使用的方法和属性的参考,这样我可以在以后使用它们
让我们一个AJAX加载图标的情况。 在一个更传统的面向对象的环境中,我可以这样做:
var myIcon = new AJAXIcon();
myIcon.start();
//some stuff
myIcon.stop();
的方法和我的对象的特性被存储,供以后使用的变量。 现在,如果我想有一个jQuery插件相同的功能,我就从我的主要代码有点这样称呼它:
$("#myId").ajaxIcon()
按照惯例,我的插件需要返回传递给我的插件,允许chainability原来的jQuery对象,但如果我这样做,我松访问插件实例的方法和属性的能力。
现在,我知道,你可以在我的插件声明一个公共职能,有点沿行
$.fn.ajaxIcon = function(options) {
return this.each(function () {
//do some stuff
}
}
$.fn.ajaxIcon.stop = function() {
//stop stuff
}
然而,在不破坏返回原始的jQuery对象的约定,我不能保留,我想指的是插件的具体实例的引用。
我希望能够做这样的事情:
var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon
myIcon.start();
//some stuff
myIcon.stop();
有什么想法吗?
如果你这样做了以下内容:
(function($){
$.fn.myPlugin = function(options) {
// support multiple elements
if (this.length > 1){
this.each(function() { $(this).myPlugin(options) });
return this;
}
// private variables
var pOne = '';
var pTwo = '';
// ...
// private methods
var foo = function() {
// do something ...
}
// ...
// public methods
this.initialize = function() {
// do something ...
return this;
};
this.bar = function() {
// do something ...
};
return this.initialize();
}
})(jQuery);
然后你就可以访问你的任何公共方法:
var myPlugin = $('#id').myPlugin();
myPlugin.bar();
这是从这个考虑非常有帮助的文章从trulyevil.com(2009年5月),这是本身延伸这篇文章 (2007年10月)从learningjquery.com。
好吧,我想通了,如何做到这一点:
插件代码:
$.ajaxIcon.init = function(element, options) {
//your initialization code
this.start = function() {
//start code
}
this.stop = function() {
//stop code
}
}
$.fn.ajaxIcon = function(options) {
this.each(function () {
//This is where the magic happens
jQuery(this).data('ajaxIcon', new jQuery.ajaxIcon.init(this, opts));
});
return this;
}
然后在代码中的其他地方使用它:
var myIcon = $("#myId").ajaxIcon.data('ajaxIcon')
// myIcon: a reference to the 'init' object specific to this plugin instance
myIcon.start();
myIcon.stop();
瞧,回答我的问题:)
我想你可以完成你在找什么东西是这样的:
var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon
$.ajaxIcon.start(myIcon);//some stuff
$.ajaxIcon.stop(myIcon);
没有测试它虽然 - 我没有一个环境,我能做到这一点ATM接入
大部分的jQuery插件,我看到试图完成,这将使用匿名范围和关闭,以独有的实例引用函数和变量。 例如,使用以下模式:
;(function ($) {
// your code
})(jQuery);
开始和模块结束之间,你可以声明任何你想要的功能。 你不会污染全局命名空间,您可以保留访问通过封闭的局部变量,这样可以解决很多你的问题。 此外,不要害怕使用$.data
的功能。