JQuery对话框:如何在按钮单击事件中找到单击按钮

时间:2011-06-15 13:19:54

标签: javascript jquery jquery-ui jquery-dialog

我目前正在定义变量号。像这样的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]在行中没有返回任何内容,因为我已经增加到其最大值。

function(){$(this).dialog(“close”); __ doPostBack(postbackControlID,buttonNames [i]);}

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

我怎样才能克服这一点?提前谢谢。

1 个答案:

答案 0 :(得分: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]]处的临时变量不是必需的,只是为了保持一致