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 上返回,而在其他 URL 上则不返回。

2)旧的JS代码没有被使用

问题仍然是上述程序删除了所有链接。我也尝试设置async为 false,但它没有帮助。

4

5 回答 5

2

成功回调由 jQuery 调用,并使用返回值。UrlExists 在您的代码中始终返回未定义的值,这被认为是错误的。试试下面这样的事情:

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 回答