3

関数が、使用できる ajax 呼び出しからデータを返すようにしようとしています。問題は、関数自体が多くのオブジェクトによって呼び出されることです。

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html, obj) {
            alert (html);
        }  
    }); 

    return false;
}

つまり、匿名の「成功」関数内では、呼び出し元の obj (または id) が実際に何であるかを知る方法がありません。私が考えることができる唯一の方法は、IDをドキュメントに添付することですが、それは少し粗雑に思えます. これを行う別の方法はありますか?

4

4 に答える 4

7

囲んでいるスコープの変数を使用できます。これは「クロージャー」と呼ばれる手法です。それで:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html) {
            alert(obj.id);  // This is the obj argument to ajax_submit().
            alert(html);
        }  
    }); 

    return false;
}
于 2010-04-28T17:17:33.030 に答える
4

ajaxを介してhtmlをページにロードしようとしている場合は、load()関数を検討することをお勧めします。

于 2010-04-28T17:18:36.470 に答える
2

JavaScriptの関数は、それらが定義されているスコープに囲まれます(これはクロージャです)。この場合、が呼び出されるたびに新しい匿名成功コールバック関数が作成されるajax_submit()ため、親スコープのすべての変数に常にアクセスできます。

コードはそのままで問題なく動作するはずです。コールバック関数が必要な場合は、次のように引数として渡して呼び出すことができますajax_submit()

…
success: function(html, obj) {
    callback(html);
}
…
于 2010-04-28T17:21:04.780 に答える
0

変数、、objおよびidmessageすべて無名関数内で使用できます。

これは、クロージャと呼ばれるJavascriptの機能が原因であり、これを読んでおくことをお勧めします。

クロージャの一般的な要点は、関数が、それが定義されたスコープに存在していた変数に永久にアクセスできることです。

この結果、次のことができるようになります。

    success: function(html) {
        alert (id);
        alert (obj);
    } 

一日中(ただし、success関数のパラメーターはajax_submit関数objの変数よりも優先されることに注意してください)。obj

于 2010-04-28T17:19:43.753 に答える