我在为我的插件提供公共功能时遇到了麻烦,就像我认为的 jQueryUI 一样。我的插件代码如下。
当$("#someField").myPlugin({'editable':true});
被调用时,它迭代指定的元素,在这种情况下只有一个#someField
并设置amount
为 0。
然后我想从代码的某个地方调用公共函数,这会影响我之前传递给插件的set10
元素。#someField
因此,当$("#someField").myPlugin("set10");
通过 switch 语句调用时,它将数量设置为 10。但是,现在当我单击该字段并click
执行内部代码时,它再次显示数量为 0。
我不明白为什么这不起作用。我认为调用.myPlugin
相同的 DOM 元素会保留数量的值,但显然我在这里遗漏了一些重要的东西。将不胜感激任何帮助和解释。
(function($)
{
$.fn.myPlugin=function(options) {
// default settings
var settings = $.extend( {
'editable': true
}, options);
return this.each(function()
{
var amount=0;
switch(options)
{
case "set10":
set10();
}
var t=$(this);
function set10()
{
amount=10;
}
t.on("click", function(e)
{
console.log(amount);
});
});
};
})(jQuery)
$("#someField").myPlugin({'editable':true});
$("#someField").myPlugin("set10");
编辑:
在仔细研究了各种模式后,我整理了一些似乎可行的东西。它几乎遵循您的描述,但如果我的方法有什么可怕的错误,请告诉我。基本上,它通过 jQuerysdata
方法将我需要的数据附加到 HTML 元素本身。然后,当函数被调用时,它会检查选项是否实际上是一个字符串,并在我们当前在每个循环中拥有的特定 DOM 元素的上下文中调用适当的方法。这是如何实现公共方法的简化版本吗?就像我说它在我的插件中工作但是我想正确地做它并且担心我的方法仍然存在一些问题。
(function($)
{
$.fn.myPlugin=function(options) {
// default settings
var settings = $.extend( {
'editable': true
}, options);
return this.each(function()
{
if(typeof options == 'string')
{
switch(options)
{
case "set10":
{
set10.call(this);
return;
}
}
}
var amount=0;
var t=$(this);
function set10()
{
var t=$(this);
amount=10;
$.data(t[0],"amount",amount);
}
t.on("click", function(e)
{
if($.data(t[0],"amount"))
amount = $.data(t[0],"amount",amount);
console.log(amount);
});
});
};
})(jQuery)