6

AJAXを使用してページ上のすべてのリンクをチェックして、それらがまだ機能するかどうかを確認する簡単な機能を作成しました。これは機能しているように見えますが、それぞれに成功クラスとエラー クラスを追加しています。AJAX 応答が 404 の場合にのみスローされるエラー コールバック関数を取得するにはどうすればよいですか?

$('li').each(function(){
    $(this).children('a').each(function(){
        $.ajax({
            url:$(this).attr('src'),
            success:$(this).addClass('success'),
            error:$(this).addClass('error')
        })
    })
});
4

4 に答える 4

6

successおよびerrorパラメータには関数が必要です。

コードを匿名関数でラップする必要があります。

//there's no need to complicate things, use one call to each()
$('li > a').each(function () {
    var $this;
    $this = $(this); //retain a reference to the current link
    $.ajax({
        url:$(this).attr('href'), //be sure to check the right attribute
        success: function () { //pass an anonymous callback function
            $this.addClass('success');
        },
        error: function (jqXHR, status, er) {
            //only set the error on 404
            if (jqXHR.status === 404) { 
                $this.addClass('error');
            }
            //you could perform additional checking with different classes
            //for other 400 and 500 level HTTP status codes.
        }
    });
});

それ以外の場合は、単なる jQuery コレクションであるsuccessの戻り値に設定しているだけです。$(this).addClass('success');

于 2012-11-09T14:39:42.637 に答える
1

まず、成功と失敗のハンドラーが必要です。コードはすべてのリンクに対して実行されるだけです。src 属性は必要ありませんが、 href プロパティは必要です。

これはうまくいくはずです:

$('li').each(function(){
   $(this).children('a').each(function(){
    $.ajax({
        url:$(this).prop('href'),
        success:function(){$(this).addClass('success')},
        error:function(){$(this).addClass('error')}
    })
  })
});

また、各ループでインデックスと値を使用する方がエレガントだと思うので、次のようにします。

$('li').each(function(){
   $(this).children('a').each(function(index,value){
    $.ajax({
        url:$(value).prop('href'),
        success:function(){$(value).addClass('success')},
        error:function(){$(value).addClass('error')}
    })
  })
});
于 2012-11-09T14:48:23.683 に答える
0

function()成功とエラーのコールバックを呼び出し内にラップする必要があります。

$('li').each(function(){
    $(this).children('a').each(function(){
        var $this = $(this);
        $.ajax({
            url:$this.attr('href'),
            success: function() {
                $this.addClass('success');
            },
            error: function() {
                $this.addClass('error');
            }
        });
    });
});
于 2012-11-09T14:42:09.453 に答える
0

他の回答では、すべてのエラーのクラスが追加されます。本当にそれが必要な場合は、次のように404する必要があります。

$(this).children('a').each(function(){
    var self;
    self = this; //retain a reference to this
    $.ajax({
        url:$(this).attr('src'),
        success: function () { //pass an anonymous callback function
            $(self).addClass('success');
        },
        statusCode: {
           404: function() {
              $this.addClass('error');
           }
        }
    });
});
于 2012-11-09T14:58:15.490 に答える