为什么jQuery死链接删除代码会删除所有链接?
此代码检查死链接。由于浏览器不允许第三方Ajax请求,我创建了一个php文件来检查死链接,我的原生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
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
函数的返回值,因为它已完成。