Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为jquery插件选择的每个元素声明变量的本地实例_Jquery_Closures - Fatal编程技术网

如何为jquery插件选择的每个元素声明变量的本地实例

如何为jquery插件选择的每个元素声明变量的本地实例,jquery,closures,Jquery,Closures,对于我正在尝试编写的JQuery插件,我希望存储一个局部变量,该变量的作用域仅限于选择器标识的HTML。在下面的基本示例中,HTML页面有两个表单元素,我分别在每个表单元素上进行选择,并在每个实例中计算表单包含的文本元素的数量。在下面的示例中,“_elements”始终包含上次调用的选择器的文本输入元素数。现在我认为这是因为Javascript的块级作用域和闭包,但不确定如何实现它。有人能告诉我我的错误吗 请不要建议不同的方法(即根本不存储变量,总是直接选择匹配元素的计数-我知道这会起作用,但这

对于我正在尝试编写的JQuery插件,我希望存储一个局部变量,该变量的作用域仅限于选择器标识的HTML。在下面的基本示例中,HTML页面有两个表单元素,我分别在每个表单元素上进行选择,并在每个实例中计算表单包含的文本元素的数量。在下面的示例中,“_elements”始终包含上次调用的选择器的文本输入元素数。现在我认为这是因为Javascript的块级作用域和闭包,但不确定如何实现它。有人能告诉我我的错误吗

请不要建议不同的方法(即根本不存储变量,总是直接选择匹配元素的计数-我知道这会起作用,但这只是局部变量问题的一个简化示例


(函数($){
var方法={
设置:功能(选项){
if($(this).length==0)
抛出新错误(“AutoSave()选择器未找到所需元素”);
如果($(此).length>1)
抛出新错误(“AutoSave()不是为处理匹配两个或多个元素的选择器而设计的!”);
_elements=$('INPUT[TYPE=TEXT]',this)
_元素。长度;
归还这个;
},
NumOfElements:函数(选项){
警报(_elements.length);
归还这个;
}
};
$.fn.autoSave=函数(方法){
if(方法[方法]){
返回方法[method].apply(this,Array.prototype.slice.call(arguments,1));
}else if(typeof方法=='object'| |!方法){
return methods.Setup.apply(这是参数);
}否则{
$.error('Method'+Method+'在jQuery.AjaxClickEvent上不存在');
}
};
})(jQuery);
$(文档).ready(函数(){
$(“#myForm”).autoSave();
$(“#myForm”).autoSave('NumOfElements');//显示1
$(“#myForm2”).autoSave();
$(“#myForm2”).autoSave('NumOfElements');//显示2
$(“#myForm”).autoSave('NumOfElements');//显示2(应为1)
});

好的,那么你的代码很好,你不是疯了。问题是方法中的
这个
。设置函数不是jQuery对象/html节点。它是方法单例。所以你总是修改相同的_元素-因此在上一个示例中为2

解决方案是添加:

var methods = {
  my_form: null,
  ...
}
然后当它全部实例化时:

$.fn.autoSave = function (method) {
  methods.my_form = this;

然后将
调用的方法更改为reference methods.my_表单。然后,您将拥有对DOM的适当对象引用。(我还建议将_元素存储在DOM中的HTML节点上,而不是“在以太中”——使用
数据

好的,那么你的代码很好,你不是疯了。问题是方法中的
这个
。设置函数不是jQuery对象/html节点。它是方法单例。所以你总是修改相同的_元素-因此在上一个示例中为2

解决方案是添加:

var methods = {
  my_form: null,
  ...
}
然后当它全部实例化时:

$.fn.autoSave = function (method) {
  methods.my_form = this;

然后将
调用的方法更改为reference methods.my_表单。然后,您将拥有对DOM的适当对象引用。(我还建议将_元素存储在DOM中的HTML节点上,而不是“在以太中”——使用
数据

Hi JohnO。我完全按照你的建议做了。添加了对my_表单的引用,然后添加了它的初始化,最后替换了对methods.my_表单的所有“this”引用。进行这些更改并没有解决问题。我也不确定是否应该这样做,我认为问题似乎不是解决“this”it is how“\u元素”存储时,它将始终包含它运行时遇到的最后一个“form”元素的计数。感谢关于“data”的说明,它确实起了作用。我仍然有兴趣知道如何解决局部变量的“作用域”问题。它似乎只是插件的局部变量,而不是表单(元素)的实例的局部变量它是附加到的。嘿,Paul,_元素的问题是,您从未使用
var
关键字将它绑定到范围。因此它在窗口/全局范围内浮动。您希望限制进入全局范围的内容的数量(它们永远不会得到GC'd、混乱等)您可以使用var将其放置在函数的作用域中,但一旦函数完成,它将被GC。通过使用
data
将元素绑定到DOM节点,它将被放置在内存中该html节点对象的作用域中。因此,它不会被覆盖或被错误访问。嗨,JohnO。我完全按照您的建议做了。添加了引用到my_表单,然后添加了它的初始化,最后替换了所有对methods.my_表单的“this”引用。进行这些更改并没有解决问题。我也不确定是否应该这样做,对我来说,问题似乎不是解决“this”,而是“\u元素”的存储方式,它将始终包含最后一个“表单”的计数运行它所针对的元素。感谢关于“数据”的说明,这确实起到了作用。我仍然有兴趣知道如何解决局部变量的“范围”问题。它似乎只是插件的局部变量,而不是它所附加的表单(元素)的实例的局部变量。嘿,Paul,_元素的问题在于