Jquery id 选择器变量无法绑定到 onchange

Posted

技术标签:

【中文标题】Jquery id 选择器变量无法绑定到 onchange【英文标题】:Jquery id selector variable cannot bind to onchange 【发布时间】:2012-06-22 23:29:02 【问题描述】:

我在表单中有输入区域列表,ID 为“contact1_title”、“contact2_title”、“contact3_title” ....

而且我在这个表单中也有一个选择列表,ID 像“contact1_name”、“contact2_name”、“contact2_name”......

我想编写一个循环来为选择动态绑定 onchange 函数。

这是我的代码:

for(var j=1;j<6;j++)                        
                    $('#contact'+j+'_name').change(function() 
                        alert(j);
                        //json.engineer is a json object
                        $('#contact'+j+'_title').val( json.engineer[this.selectedIndex-1].title );
                    );

当我更改选择时,它总是提示 6。

并且标题输入区域不能通过选择来改变。

这是否意味着javascript中的变量总是改变?

如何动态绑定动作?

我可以使用 "this.name.split("_")[0]" 破解它,但代码看起来很难看。

提前致谢。

【问题讨论】:

Javascript closure inside loops - simple practical example的可能重复 谢谢。我之前没有找到这个答案。 这是只有知道问题所在才能找到的问题之一;) 【参考方案1】:

通过闭包包装您的 change 功能:

for(var j=1;j<6;j++)     
    (function(j)                   
         $('#contact'+j+'_name').change(function() 
             alert(j);
             //json.engineer is a json object
             $('#contact'+j+'_title').val( json.engineer[this.selectedIndex-1].title );
         );
     )(j);

问题是,当你点击时,你的循环已经结束,所以j 等于6

【讨论】:

事件处理程序已经是一个闭包。更正确的解释是:“使用立即执行的函数表达式来创建新范围”(或类似的东西)。 @FelixKling 我的新解释怎么样?【参考方案2】:

另一种解决方案是将计数器作为事件数据传递:

for(var j=1;j<6;j++)                        
    $('#contact'+j+'_name').change(index: j, function(event) 
        $('#contact' + event.data.index + '_title')
           .val(json.engineer[this.selectedIndex-1].title );
    );

如果您可以避免使用for 循环,那就更好了,但这取决于您的标记以及您是否可以控制创建的元素,因为您可能必须调整它们才能这样做。

【讨论】:

你改变了 event.data.indexj :)【参考方案3】:

已经有闭包了,好好利用吧。

for(var j=1;j<6;j++)                        
     $('#contact'+j+'_name').change(function() 
     var k=j;
     alert(k);
     //json.engineer is a json object
     $('#contact'+k+'_title').val( json.engineer[this.selectedIndex-1].title );
     );

【讨论】:

以上是关于Jquery id 选择器变量无法绑定到 onchange的主要内容,如果未能解决你的问题,请参考以下文章

jquery选择器中加变量参数

如何将变量id添加到jquery的选择器中

jquery选择器中加变量参数

带有变量的 jQuery 选择器

将一个 id 数组输入到 jquery 选择器中

jquery 选中文本框 jquery 文本框样式 jquery 改变样式