2011-06-15 123 views
3

我目前正在定义一个变量no。这样的jQuery对话框的按钮JQuery对话框:如何找到按钮点击事件中的点击按钮

var buttonNames = buttonNamesString.split("|"); 
    var buttonsOpts = {}; 
    for (i = 0; i < buttonNames.length; i++) { 
     buttonsOpts[buttonNames[i]] = function() { $(this).dialog("close");__doPostBack(postbackControlID, buttonNames[i]);} 
    } 

并像这样初始化对话框。 (注意线按钮:buttonsOpts那我如何传递变量没有按钮的。)

var parentElement = popupControl.parent();    
      popupControl.dialog({ 
           autoOpen: false, 
           modal: true, 
           buttons: buttonsOpts,         
           hide: "explode", 
           open:function(type, data){ 
            $(this).parent().appendTo(parentElement); 
            popupControl.css({visibility: "visible"});           
           } 
           }); 

当在对话框中的按钮被点击buttonNames问题是[I]返回任何在线路,因为我已递增到最大值。

函数(){$(本).dialog( “关闭”); __ doPostBack(postbackControlID,buttonNames [I]);}

我们可以访问哪些从事件代码中触发一个事件的对象Javascript就像我们在.Net事件中使用sender对象一样。这将解决这个问题。

我该如何克服这个问题?提前致谢。

回答

1

问题是你在循环迭代变量上使用闭包。这应该通过改变索引的范围来解决它。

for (i = 0; i < buttonNames.length; i++) { 
     var index = i; 
     buttonsOpts[buttonNames[index]] = function() { $(this).dialog("close");__doPostBack(postbackControlID, buttonNames[index]);} 
    } 

较长的回答你的问题是,你产生的所有引用相同数目的变量,i功能。因此,在循环结束时,所有函数都设置为buttonNames.length。由于在buttonNames [buttonNames.length]中定义的数组中没有按钮,因此您会得到undefined

注:不需要在buttonOpts[buttonNames[index]]临时变量,它只是有一致性