4

これを想像してください:

$('#blah').on('click', function(){
    var cat_id = $(this).attr('id');
    $.ajax({
        // stuff...
        data: {cat_id: cat_id}, // <--------------------
        // stuff...
    }).done(function(){
        alert(cat_id); // <-------------------- not defined...
    });
});

ご存知のように、jQuery は の以前の使用タイプを廃止し$.ajax、新しいパターンは上記のようになります。関数内の上記のコードではdone()、どのようにアクセスできますcat_idか? done() 関数$(this)ではもう認識されず、cat_idどちらも...

jQueryが導入される前done()は、送信されたデータに簡単にアクセスできましたsuccess:.

4

4 に答える 4

1

あなたが書いた振る舞いを再現することはできませんでしたが、done関数でjQuery(this)にアクセスする必要がある場合は、次のようにすることができます。

$('#blah').on('click', function(){
    var cat_id = $(this).attr('id');
    var $self = $(this);
    $.ajax({
        // stuff...
        data: {cat_id: cat_id}, 
        // stuff...
    }).done(function(){
        alert($self.attr('id')); 
    });
});
于 2013-03-01T12:39:51.360 に答える
1

あなたの例では、まだスコープ内にあるため、done 関数でまだ cat_id にアクセスできます。$(this) にアクセスする必要がある場合は、次のように done コールバックにバインドする必要があります。

$('#blah').on('click', function(){
    var cat_id = $(this).attr('id');
    $.ajax({
        // stuff...
        data: {cat_id: cat_id}, // <--------------------
        // stuff...
    }).done(function(){
        alert(cat_id); // alerts 'blah'
        alert($(this).attr('id')); // also alerts 'blah'
    }.bind(this)); // NOTICE THIS
});
于 2013-03-01T12:44:01.063 に答える
0

回避策になる可能性がありますが、このように行うことができます...

cat_idを$(this).data( "catId")に保存してから、簡単にアクセスできるようにして、それに応じて複数のイベントを簡単に処理できるようにします。

ハッピーコーディング:)

于 2013-03-01T12:37:45.613 に答える
0

クロージャーの力を試してみることができます。これはうまくいくはずです:

var cat_id = $(this).attr('id');
var done_handler = function(){
        alert(cat_id);
};
    $.ajax({
        // stuff...
        data: {cat_id: cat_id}, // <--------------------
        // stuff...
    }).done(done_handler);
于 2013-03-01T12:42:18.360 に答える