【发布时间】:2011-10-05 11:46:16
【问题描述】:
我正在制作一个基于jQuery.ajax() 的 AJAX 脚本,并且已经到了应该以某种方式检查我尝试加载的链接是 html 页面还是其他不同的东西(如 swf、图像或 zip)的地步。所以我需要以某种方式检查内容类型标头并决定是否也应该获取内容(如果它是 html)或者扔掉 ajax 调用并执行window.location = theUrl。我不想要的是获取整个文件只是为了发现它是一个 100MB 的 zip 文件。
有没有办法在请求仍在进行时“暂停”(或中止)请求并仅读取标头? HEAD call 不是一个选项,因为这样我每次都必须向服务器发出 2 个请求。
也许是某种带有 setTimeout 和低级 xhr 函数的 hack?
提前致谢! :)
编辑:尝试在请求完成之前从 setTimeout 中的 xhr 获取标头,但在获取所有数据之前它似乎不会填充它。
编辑 2:我破解了 jquery 将自身绑定到 onreadystatechange 的方法:
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(...) 然后以相同的方式绑定它将不起作用。那么我的 xhr 与 jquery 的有何不同呢?我看到他们这样做:
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch( e ) {}
}
所以它不应该有所作为?
编辑 3:找到了! jquery 1.6 返回一个只有少量属性的假 xhr 对象,onreadystatechange 不是其中之一。
【问题讨论】:
-
为什么 HEAD 不是一个选项?这正是它的用途,HEAD 请求的成本应该几乎为零。 HTTP 是一个很棒的协议,如果人们开始使用它的所有功能,网络将会是一个更好的地方。
-
我不想再提出任何要求。也许如果我没有找到另一种方法来做到这一点......
标签: jquery ajax http content-type xmlhttprequest