jQuery AJAX只获取标题并决定是否获取内容

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而不是其中之一.

Ray*_*jax 9

通过使用类型'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)


Alb*_*iks 6

您可能需要破解jQuery。我不知道该怎么做,但是...

jQuery使用XMLHttpRequest()加载数据。如果您在此处查看(请注意页面的滚动位置)

http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener

您会发现可以以某种方式附加一个侦听器,以侦听要加载的标头。数据将继续加载,但是使用abort()函数可以中止该操作。如果您查看jQuery源代码:

http://www.google.com/codesearch#LARMQtWqu54/trunk/spec/support/jquery-1.4.4.js&q=xmlhttprequest%20package:jQuery&type=cs

并搜索xhr.send(1个匹配项)和window.XMLHttpRequest(2个匹配项),您将看到jQuery本机不使用这些选项(请注意xhr是XMLHttpRequest)。但是,在window.XMLHttpRequest的第一个匹配项中,注释中指出可以覆盖此对象。但是,在第二场比赛中,注释不存在,所以我不确定是否也可以覆盖此注释(因此,您可能需要破解才能使其在所有浏览器中均可工作)。您将需要扩展XMLHttpRequest并修改构造方法和/或send方法以调用其父方法。以注释引用的方式将该对象传递给jQuery。

希望您知道侦听器的工作方式以及javascript中面向对象的工作方式。