1

このコードは、デッド リンクをチェックします。サードパーティの Ajax リクエストはブラウザーで許可されていないため、デッド リンクをチェックするための php ファイルを作成しました。私のネイティブ jQuery コードは次のとおりです。

function UrlExists(urlx) {
    $.ajax({
        url: "/chk.php?url=" + encodeURIComponent(urlx),
        cache: false,
        method: 'get',
        success: function (data) {
            if (data.indexOf("T") != -1) {
                return true;
            }
            else {
                return false;
            }
        }
    });
}
$(document).ready(function () {
    $("table[id^='row']").each(function () {
        if (!UrlExists($(this).find("a[href$='mp3']").attr('href'))) {
            $(this).remove();
        }
    })
});

一方、私はそれを確認しました

1)chk.php正常に動作しT、一部の URL で返される場合と返されない場合があります。

2) 古い JS コードは使用されていません

それでも問題は、上記のプログラムがすべてのリンクを削除することです。私もasyncfalse に設定しようとしましたが、役に立ちません。

4

5 に答える 5

2

成功のコールバックは jQuery によって呼び出され、戻り値を消費します。コード内の UrlExists は常に未定義の値を返しますが、これは false と見なされます。以下のようなことを試してください:

function urlExists(url, callback)
{
    $.ajax({
        url: "/chk.php?url="+encodeURIComponent(url),
        cache: false,
        method: 'get',
        success: function(data){
            if (data.indexOf("T") != -1){
                callback(true);
            } else {
                callback(false);
            }
        }
    });
}


$(document).ready(function() {
    $("table[id^='row']").each(function() {
        var url = $(this).find("a[href$='mp3']").attr('href');
        var self = this;
        urlExists(url, function (exists) {
            if (! exists) {
                $(self).remove();
            }
        });
    });
});

または、他の回答で説明されている同期メソッドを使用して urlExists を記述することもできますが、各フェッチ中に JavaScript エンジンがブロックされ、複数のリクエストが同時に発生しないため、さらに遅くなります。

于 2012-06-25T11:21:58.523 に答える
1

問題は、成功コールバック内で戻ることです。その戻り値は外部関数に到達しないため、UrlExist()今日書かれているように何も返されません。

成功コールバック内から削除を実行するか、リンクを削除する別の関数を呼び出す必要がありますが、その関数は成功コールバック内から呼び出す必要があります。

于 2012-06-25T11:16:18.570 に答える
0

Ajax呼び出しは非同期です。したがって、オブジェクト内の戻りは正しく機能しません(またはまったく機能しません)。

コールバック関数が必要です

function Urlexists(urlx,callback){

    [..]
    if(data.indexOf("T") != -1){
        callback(true);
    }
    [..]

}
于 2012-06-25T11:16:19.560 に答える
0

以前はプレーンな JavaScript で同じコードがあり、それは同期的でした。jQuery では、次のようになります。

return $.ajax({
    url: "/chk.php?url="+encodeURIComponent(urlx),
    async: false,
    cache: false,
    method: 'get'
}).responseText.indexOf("T") > -1;

これは、そのコードを jQuery に交換したいだけの場合です。非同期にしたい場合は、コールバック関数で削除する必要があります。

于 2012-06-25T11:21:42.553 に答える
0

AJAX 呼び出しは非同期 (AJAX の最初の A) であるため、関数はサーバーからの応答が到着する前に戻ります。

成功のコールバック関数で削除を行います。

function UrlExists(urlx, element) {
  $.ajax({
    url: "/chk.php?url="+encodeURIComponent(urlx),
    cache: false,
    method: 'get',
    success: function(data){
      if(data.indexOf("T") == -1){
        element.remove();
      }
    }
  });
}

$(document).ready(function() {
  $("table[id^='row']").each(function(){
    UrlExists($(this).find("a[href$='mp3']").attr('href')), $(this))
  })
});
于 2012-06-25T11:24:05.050 に答える