2011-05-31 65 views
2

当我尝试使用jQuery .toChecklist插件在选择列表上使用.change()事件时,遇到问题。挂钩jQuery .toChecklist上的change()事件

我的页面包含一些选择列表,使用jQuery将其更改为CheckLists。

考虑以下JavaScript代码段:

for (var i=0;i<5;i++) 
{ 
    var selectListId = 'selectList' + i; 

    // Assume this line represents the outputting on a 
    // standard select list 

    // Convert to Checklist 
    $("#" + selectListId).toChecklist(); 
    $("#" + selectListId).change 
    (
    function() 
    { 
     alert("SelectListId: " + selectListId); 
    } 
); 
} 

这个循环的每次迭代中,我输出多选列表,将其转换成清单,然后添加.change()处理。然而,当页面呈现(视觉上,一切都很好)时,从任何列表中选择一个选项给出“SelectListId:selectList4”的警报文本(即循环的最后一个列表ID)。因此,似乎每次调用.change()将全局替换更改处理程序。

有谁知道如何更改代码,以便每个清单都有自己的更改处理程序(以便第一个更改处理程序将输出“SelectListId:selectList0”等)。

谢谢,

回答

1

尝试从循环中拉出更改功能。我还添加了一个向每个列表添加一个类的行。新的更改功能引用了该类的列表,并且将通过this知道哪些正在被更改。

for (var i = 0; i < 5; i++) { 

    var selectListId = 'selectList' + i; 

    $("#" + selectListId).toChecklist(); 
    $("#" + selectListId).addClass('newChecklist'); 
} 

$('.newChecklist').change(function() { 
    alert($(this).attr('id')); 
}); 
+0

这是行不通的,并且在大多数情况下会是一个很好的方法,所以我将它标记为接受的答案,但是在这个实例中我的示例代码片段的简单性已经对我起作用了,我不能在循环之外工作(因为我不知道我有多少清单以及他们的Id是什么,因为还有其他的控制输出)。 :) – Crollster 2011-06-01 01:30:43

1

因此,经过大量的头部刮擦之后,我找到了解决此问题的方法。 虽然在匿名函数中将字符串连接在一起会以意想不到的方式运行,但引用整行代码并将其包装在eval语句中会产生所需的结果。

这样,不是写作,如上:

$("#" + selectListId).change 
(
    function() 
    { 
    alert("SelectListId: " + selectListId); 
    } 
) 

你需要,而不是写:

eval('$("#' + selectListId + '").change(function(){alert("SelectListId: ' + selectListId + '");});'); 

这可能不是最好的方法,但它的工作原理,现在来看这够好! :-)

+0

使用eval时要小心,有几个安全和性能问题。 http://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea – wdm 2011-06-01 02:01:09