第一个问题是异步发送请求并更改其属性“status”的时间比执行下一个表达式——if(request.status === "404")更慢。因此,由于网络带宽的原因,请求状态将最终保持为0(零),并且它将无法实现if语句下方的代码。要解决这个问题很容易:在ajax请求的打开方法中将'true'更改为'false'。这将导致您的代码短暂地(或不那么)被阻塞(由于同步调用),但会在到达if测试之前更改请求的状态。
第二个问题是状态是一个整数。使用 '===' javascript 比较运算符时,您正在尝试比较左侧对象是否与右侧对象完全相同。要使此操作正常工作,有两种方法:
第三个问题是XMLHttpRequest对象仅适用于较新的浏览器(Firefox、Chrome和IE7+)。如果您希望该代码片段在所有浏览器上都能正常工作,您必须按照W3Schools的建议进行操作:w3schools ajax
对我真正有用的代码是:
var request;
if(window.XMLHttpRequest)
request = new XMLHttpRequest();
else
request = new ActiveXObject("Microsoft.XMLHTTP");
request.open('GET', 'http://www.mozilla.org', false);
request.send(); // there will be a 'pause' here until the response to come.
// the object request will be actually modified
if (request.status === 404) {
alert("The page you are trying to reach is not available.");
}
var request = new XMLHttpRequest();
request.open('GET', 'http://www.mozilla.org', true);
request.onreadystatechange = function(){
if (request.readyState === 4){
if (request.status === 404) {
alert("Oh no, it does not exist!");
}
}
};
request.send();
但是请注意它只能在相同的源上运行。对于另一个主机,你将不得不使用服务器端语言来完成这个任务,而且你必须自己解决。
我在我的场景中发现这个方法可行。
自 jQuery 1.5 引入的 jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调方法已经在 jQuery 1.8 中被弃用。为了准备将来删除它们,应该使用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。
$.get("urlToCheck.com").done(function () {
alert("success");
}).fail(function () {
alert("failed.");
});
// if-url-exist.js v1
function ifUrlExist(url, callback) {
let request = new XMLHttpRequest;
request.open('GET', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('Accept', '*/*');
request.onprogress = function(event) {
let status = event.target.status;
let statusFirstNumber = (status).toString()[0];
switch (statusFirstNumber) {
case '2':
request.abort();
return callback(true);
default:
request.abort();
return callback(false);
};
};
request.send('');
};
使用示例:
ifUrlExist(url, function(exists) {
console.log(exists);
});
async/await
,我成功地打开了一个新的标签页;出于和 OP 相同的原因,我需要检测 404 错误:openHelp : async function(iPossiblyBogusURL) {
const defaultURL = `http://guaranteedToWork.xyz`;
const response = await fetch(iPossiblyBogusURL);
if (response.status == 200) {
window.open(iPossiblyBogusURL, `_blank`);
} else if (response.status === 404) {
window.open(defaultURL, `_blank`);
}
},
无需单独进行HTTP请求以提前检查。
您可以切换逻辑:仅当iframe成功加载后才显示。为此,可以将一个onload
事件监听器附加到iframe上。
有关详细信息,请参见相关问题: 捕获iframe加载完成事件
您可以尝试在页面上执行简单的GET操作,如果返回200,则表示该页面存在。使用jQuery尝试此操作,函数是成功页面加载的回调函数。请注意,为了防止XSS,此方法仅适用于您域内的站点。其他域必须在服务器端处理。
$.get(
yourURL,
function(data, textStatus, jqXHR) {
//load the iframe here...
}
);