我正在制作一个基于 jQuery.ajax()
的 AJAX 脚本并且已经到了我应该以某种方式检查我试图加载的链接是否是 html 页面或其他东西的地步不同于 swf、图像或 zip。所以我需要以某种方式检查内容类型 header 并决定是否也应该获取内容(如果它是 html)或放弃 ajax 调用并执行 window.location = theUrl
。我不想得到整个文件只是为了发现它是一个 100MB 的 zip 文件。
有没有办法在请求仍在进行时“暂停”(或中止)并只读取标题? HEAD
调用不是一个选项,因为这样我每次都必须向服务器发出 2 个请求。
也许是对 setTimeout
和低级 xhr 函数的某种破解?
提前致谢! :)
编辑:尝试在请求完成之前从 setTimeout 中的 xhr 获取 header ,但在获取所有数据之前它似乎不会填充它。
编辑 2:我破解了将自身绑定(bind)到 onreadystatechange 的 jquery 东西:
var xhrr = new window.XMLHttpRequest();
$.ajaxSetup({
xhr: function() { return xhrr }
});
...
$.ajax(....);
var theirfunc = xhrr.onreadystatechange;
xhrr.onreadystatechange = function() {
console.log('xhr state: ', xhrr.readyState);
theirfunc();
};
所以这给了我状态 1、2、3、4 的顺序,我可以获取内容类型并成功中止。我仍在调查为什么当 jquery 本身创建 XMLHttpRequest 对象时它不起作用。如果我跳过 ajaxSetup 部分并获取 var xhrr = $.ajax(...)
然后以相同的方式绑定(bind)它不会工作。那么我的 xhr 与 jquery 有何不同?我看到他们是这样做的:
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch( e ) {}
}
所以它应该没有什么不同?
编辑 3:找到了! jquery 1.6 返回一个只有少量属性的假 xhr 对象,onreadystatechange
不是其中之一。
最佳答案
通过使用“HEAD”类型,jQuery 不会下载内容,它只会获取标题。
然后您可以通过对返回的 XHR 对象使用 getResponseHeader 按名称获取它们。
$.ajax({
type: 'HEAD',
url: 'http://example.com/api.php',
complete: function(xhr) {
var contentLength = xhr.getResponseHeader('Content-Length');
}
});
您还可以使用以下命令获取所有响应 header 的列表:
xhr.getAllResponseHeaders()
关于jQuery AJAX 仅获取标题并决定是否获取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696229/