3

Jquery で ASP.NET MVC を使用していますが、これは jquery の障害のようです。

私は自分のメソッドに ajax 呼び出しを行っています。私のコードは

$('.reopenBtn').live('click', function () {
    var taskId = $(this).attr("data-taskid");

    $.ajax({
        url: '/Task/ReopenTask/?strTaskId=' + taskId,
        type: "POST",
        success: function (data) {
            // this does not work !!
            $(this).parent().parent().closest("div").remove();              
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert('Error');
        }
    });
});

removeただし、この質問の jsfiddle をここで作成すると、これは機能します。

では、$(this)ajax 呼び出しの成功関数内に何か違いはありますか?

どうすればこれを回避できますか? ありがとう

4

3 に答える 3

7

contextプロパティはajaxの成功関数内で機能しますcontext: this,

$('.reopenBtn').live('click', function () {
    var taskId = $(this).attr("data-taskid");
    var self = this;
    $.ajax({
        url: '/Task/ReopenTask/?strTaskId=' + taskId,
        type: "POST",
        success: function (data) {
            $(self).parent().parent().closest("div").remove();              
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert('Error');
        }
    });
});

contextまたは、ajax オプションのプロパティを設定することもできます。

    $('.reopenBtn').live('click', function () {
        var taskId = $(this).attr("data-taskid");
        $.ajax({
            url: '/Task/ReopenTask/?strTaskId=' + taskId,
            type: "POST",
            context: this,
            success: function (data) {
                $(this).parent().parent().closest("div").remove();              
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert('Error');
            }
        });
    });
于 2012-09-23T05:59:49.513 に答える
1

$.proxy でラップするこの方法を好みます。2 つの引数はコールバック関数でありthis、2 番目の引数です。

$.post('/foo', data, $.proxy(function(d){
  // do stuff with data
}, this));

一番短くてきれいだと思います。

(は予約語です) にコピーthisしてからコールバックで使用するか、パラメーターで $.ajax を使用して、上記の他の人が言うこともできます。thatselfcontext: this

于 2012-09-23T06:25:50.787 に答える
0

メソッドのコンテキストは、clickメソッドの場合とまったく同じではありませんsuccessthisしたがって、内部関数には同じものがありません。$thisまたはのようなローカル変数を使用してそれを回避し、メソッドclickedButtonで使用することができます。success

$('.reopenBtn').live('click', function () {
  var $this = $(this)
  var taskId = $this.attr("data-taskid");

  $.ajax({
    url: '/Task/ReopenTask/?strTaskId=' + taskId,
    type: "POST",
    success: function (data) {
        // $this is taken from the outer function context
        $this.parent().parent().closest("div").remove();              
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert('Error');
    }
  });
});

詳細な説明については、JavaScriptのクロージャをご覧ください。

于 2012-09-23T06:15:41.793 に答える