有一个外部网站,其中包含一年中每一天的html文档,我正在尝试自动加载当前日期的文档。但是,每个文档的网址都不一致。其中一些以.html
结尾,而另一些以.htm
结尾,其中一些可能会在文件名后附加一个字母。
我想要做的是尝试加载网址,如果导致404错误,请尝试加载其他网址。
例如,我可能会window.location.replace(baseurl+'.htm');
如果这导致404错误,请尝试window.location.replace(baseurl+'.html');
,如果这导致404,请尝试别的。
如何确定服务器何时发送404错误并尝试加载新网址?
答案 0 :(得分:2)
这是一个可以传递扩展名来尝试的函数,它会将第一个有效的URL返回给回调函数:
var request = new XMLHttpRequest();
var extensions = ['.html', '.htm'];
var count = 0;
var baseurl = 'http://blah.com/file';
function validUrl(baseurl, cb) {
request.open('GET', baseurl + extensions[count], true);
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
cb(baseurl + extensions[count]);
} else {
count++;
if (count === extensions.length) {
cb(false);
} else {
validUrl(baseurl, cb);
}
}
}
};
request.send();
}
// usage:
validUrl(baseurl, function(url) {
if (url) {
// use the valid url
} else {
console.log('no valid urls');
}
});
答案 1 :(得分:1)
正如@Siguza所说,你可以坚持异步请求并验证它的状态。
我建议你创建一个调用AJAX的函数,并处理它的状态,如果它是否可以作为布尔值返回给你。类似的东西:
// I'm building an function to validate the URL
function checkValidURL(url) {
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
// code for older browsers
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
// Callback
xmlhttp.onreadystatechange = function() {
if (this.status == 200) {
return true; // OK
} else { // or -> } else if (this.status == 404) {
return false; // Ops, something happen..
}
};
// AJAX configuration
xmlhttp.open("GET", url, false); // <- "false" for a synchronous request
xmlhttp.send();
}
简单的使用示例:
if (!checkValidURL("http://www.my_url")) {
console.log("invalid URL");
// Call or check other URL
} else {
// It's OK, proceed with the business rules
}
函数可以通过设置异步&#34; false&#34;等待:Is there any way to wait for AJAX response and halt execution?
来等待AJAX请求