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"});                                          
                                }  
                                });

問題は、ダイアログ内のボタンがクリックされたときに、i が最大値までインクリメントされているため、buttonNames[i] が行に何も返さないことです。

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

.Net イベントで送信者オブジェクトを使用するように、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

注:の一時変数buttonOpts[buttonNames[index]]は必須ではありません。一貫性を保つためにあります。

于 2011-06-15T13:30:36.260 に答える