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

为什么jQuery死链接删除代码会删除所有链接?,jquery,Jquery,此代码检查死链接。由于浏览器不允许第三方Ajax请求,我创建了一个php文件来检查死链接,我的原生jQuery代码是: function UrlExists(urlx) { $.ajax({ url: "/chk.php?url=" + encodeURIComponent(urlx), cache: false, method: 'get', success: function (data) { i

此代码检查死链接。由于浏览器不允许第三方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
工作正常,在某些URL上返回
T
,而在其他URL上返回不正常

2) 没有使用旧的JS代码


但问题是上面的程序删除了所有链接。我还尝试将
async
设置为false,但没有帮助

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


您必须从成功回调中执行删除操作,或者调用另一个删除链接的函数,但该函数仍必须从成功回调中调用。

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

您需要一个回调函数

function Urlexists(urlx,callback){

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

}

您以前在纯javascript中有相同的代码,并且是同步的。在jQuery中,它将是:

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

如果您只是想将该代码换成jQuery,那么就可以这样做。如果还希望使其异步,则必须在回调函数中执行删除操作。

成功回调由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();
            }
        });
    });
});

或者您可以使用其他答案中描述的同步方法编写URLEISTS,但是它会在每次提取期间阻塞javascript引擎,而且速度较慢,因为不能同时发生多个请求。

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))
  })
});

是的,否则您将无法从该函数中访问正确的元素。嗯,尽管现在函数名有误导性。这让人困惑,我认为问题是返回的值被成功回调消耗掉了。异步是如何发挥作用的?@Shubham:AJAX调用异步意味着请求被发送到服务器,
$。AJAX
函数调用立即返回。当来自服务器的响应到达时,success回调函数将运行。成功函数的返回值不能用作
UrlExists
函数的返回值,因为它已完成。