我正在创建一个jQuery插件,它需要在第一次调用时执行一些操作(并且只是第一次)。我第一次需要从dom的一部分构建索引时,我只想这样做一次并在其余时间使用该索引。
理想情况下,我希望它能像这样工作:
首先我尝试了这个:
$.fn.search = function() {
if( !inited ) {
/*
Define everything that should only be defined the first time
*/
}
/*
All methods for my plugin, including an init() method
*/
if( !inited ) {
init();
var inited = true;
}
};
但是我发现,每次调用插件时,所有变量都消失了,所以这不起作用。我知道我可以存储这样的东西:
$.fn.search.config = {
inited = false,
output,
search,
singleElems,
templates,
included,
scoreBoard,
container,
singles
}
并在init()中定义它们,但这是为插件存储内容的最佳方式吗?
答案 0 :(得分:4)
使用data
,这就是大多数插件存储状态和避免重复初始化的方式:
$.fn.search = function() {
return this.each(function() { // For each selected element
var data = $(this).data("search");
if ( !data ) {
var state = {};
// Your plugin logic
$(this).data("search",state);
}
});
};
答案 1 :(得分:2)
您可以使用.data('myPluginData',{a:b,c:d})
(docs)将所需的所有设置存储在附加到应用插件的元素的单个命名空间对象中。请参阅:http://docs.jquery.com/Plugins/Authoring#Data表示数据部分,http://docs.jquery.com/Plugins/Authoring#Plugin_Methods表示方法调用逻辑。
通过这种方式,您可以轻松跟踪已使用的设置,并使用if ($(this).data('myPluginData'))
之类的内容来确定是否已在任何给定对象上调用插件,只需使用类似$(this).data('myPluginData').settingA
的内容来访问存储设置。