3

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

function() { $(this).dialog("close");__doPostBack(postbackControlID, buttonNames[i]);}

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

我该如何克服呢?提前致谢。

4

1 回答 1

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.

注意:临时变量 atbuttonOpts[buttonNames[index]]不是必需的,它只是为了保持一致性

于 2011-06-15T13:30:36.260 回答