sto*_*ker 2 ajax jquery content-type http xmlhttprequest
我正在制作一个基于AJAX的脚本,jQuery.ajax()并且已经到了我应该以某种方式检查我正在尝试加载的链接是一个html页面还是像SWF,图像或zip那样不同的东西.所以我需要以某种方式检查内容类型标题并决定是否应该获取内容(如果它是html)或抛出ajax调用并执行window.location = theUrl.我不想要的是获取整个文件只是为了找出它是一个100MB的zip文件.
有没有办法在请求仍然继续时"暂停"(或中止)请求并只读取标题?HEADcall不是一个选项,因为这样我每次都要向服务器发出2个请求.
也许某种黑客setTimeout和低级别的xhr函数?
提前致谢!:)
编辑:尝试在请求完成之前从sethrout中的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();
};
Run Code Online (Sandbox Code Playgroud)
所以这给了我状态1,2,3,4的顺序,我可以得到内容类型并成功中止.我还在调查当jquery自己创建XMLHttpRequest对象时它为什么不起作用.如果我跳过ajaxSetup部分var xhrr = $.ajax(...)然后以相同的方式绑定它将无法工作.那么我的xhr和jquery有什么不同呢?我看到他们这样做:
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch( e ) {}
}
Run Code Online (Sandbox Code Playgroud)
所以它不应该有所作为?
编辑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');
}
});
Run Code Online (Sandbox Code Playgroud)
您还可以获取所有响应标头的列表:
xhr.getAllResponseHeaders()
Run Code Online (Sandbox Code Playgroud)
您可能需要破解jQuery。我不知道该怎么做,但是...
jQuery使用XMLHttpRequest()加载数据。如果您在此处查看(请注意页面的滚动位置)
http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener
您会发现可以以某种方式附加一个侦听器,以侦听要加载的标头。数据将继续加载,但是使用abort()函数可以中止该操作。如果您查看jQuery源代码:
并搜索xhr.send(1个匹配项)和window.XMLHttpRequest(2个匹配项),您将看到jQuery本机不使用这些选项(请注意xhr是XMLHttpRequest)。但是,在window.XMLHttpRequest的第一个匹配项中,注释中指出可以覆盖此对象。但是,在第二场比赛中,注释不存在,所以我不确定是否也可以覆盖此注释(因此,您可能需要破解才能使其在所有浏览器中均可工作)。您将需要扩展XMLHttpRequest并修改构造方法和/或send方法以调用其父方法。以注释引用的方式将该对象传递给jQuery。
希望您知道侦听器的工作方式以及javascript中面向对象的工作方式。
| 归档时间: |
|
| 查看次数: |
5656 次 |
| 最近记录: |