我正在编写一个jQuery插件,需要跟踪页面上使用该插件的对象数量。有没有办法在插件中创建一个跟踪自身实例的静态变量?
这是我到目前为止的插件:
(function ($) {
$.fn.my_plugin = function (options)
{
var plugin_count = 0;
return this.each(function() {
alert(++plugin_count);
});
}
}(jQuery));
在我的页面上:
<div class="plugin_div"></div>
<div class="plugin_div"></div>
<div class="plugin_div"></div>
<div class="plugin_div"></div>
<script language="javascript">
$('.plugin_div').my_plugin();
</script>
当页面加载时,我会收到四个警报,显示“1”。
如何编写此代码,以便为调用my_plugin()
?
编辑:修复了糟糕的copypaste工作。
答案 0 :(得分:7)
你可以这样做:
(function ($) {
$.fn.my_plugin = function (options)
{
$.fn.my_plugin.count = $.fn.my_plugin.count || 0;
return this.each(function() {
alert(++$.fn.my_plugin.count);
});
}
}(jQuery));
或者不要使用$.fn
,而是使用$.my_plugin.count
,因此您还可以将插件的默认值定义为:
$.my_plugin = {
count : 0,
defaults : {}
};
// Extend options with plugin defaults!
$.extend(options, $.my_plugin.defaults);
答案 1 :(得分:1)
在JavaScript函数中是第一类对象,因此您可以在它们上存储任意属性,例如$.fn.my_plugin.whatever
当然如果你能在不重复功能名称的情况下做到这一点会更好 - 但不推荐使用arguments.callee
,所以你必须继续使用完整的功能名称。
答案 2 :(得分:0)
只需将“plugin_count”的声明移到函数外部:
(function ($) {
var plugin_count = 0;
$.fn.my_plugin = function (options)
{
return this.each(function() {
alert(++plugin_count);
});
}
}(jQuery));
它捕获由外部匿名函数调用形成的闭包中的“plugin_count”。当闭包为你做这件事时,不需要将计数保持为任何显式对象的属性。