为什么jQuery死链接删除代码会删除所有链接?

时间:2012-06-25 11:14:38

标签: jquery

此代码检查死链接。由于浏览器不允许第三方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,而在其他网址上则不返回。{/ p>

2)没有使用旧的JS代码

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

5 个答案:

答案 0 :(得分: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引擎阻塞,而且由于多个请求不能同时发生,因此速度较慢。

答案 1 :(得分:1)

问题是你在成功回调中返回,返回将不会到达外部函数,因此UrlExist()不返回任何今天写的内容。

你要么必须在你的success-callback中进行删除,要么调用另一个删除链接的函数,但是仍然必须从你的success-callback中调用该函数。

答案 2 :(得分:0)

Ajax调用是异步的。因此,对象内的返回不能正常工作(或根本不工作)。

您需要一个回调函数

function Urlexists(urlx,callback){

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

}

答案 3 :(得分:0)

你之前在普通的javascript中使用相同的代码并且它是同步的。在jQuery中,它将是:

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

如果您只想将该代码换成jQuery,那就是这样。如果你还想使它异步,你必须在回调函数中进行删除。

答案 4 :(得分: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))
  })
});