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

我正在制作一个基于jQuery.ajax()的AJAX脚本,并且已经到了我应该以某种方式检查我正在尝试加载的链接是一个html页面还是像SWF,图像或zip那样不同的东西。 所以我需要以某种方式检查内容类型标题并决定是否应该获取内容(如果它是html)或抛出ajax调用并执行window.location = theUrl 。 我不想要的是获取整个文件只是为了找到它是一个100MB的zip文件。

有没有办法在请求仍然继续时“暂停”(或中止)请求并只读取标题? HEAD调用不是一个选项,因为这样我每次都必须向服务器发出2个请求。

也许某种破解与setTimeout和低级xhr函数?

提前致谢! 🙂

编辑:尝试在请求完成之前在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不是其中之一。

你可能不得不破解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中工作。

通过使用类型’HEAD’,jQuery不会下载内容,它只会获取标题。

然后,您可以通过在返回的XHR对象上使用getResponseHeader来按名称获取它们。

 $.ajax({ type: 'HEAD', url: 'http://example.com/api.php', complete: function(xhr) { var contentLength = xhr.getResponseHeader('Content-Length'); } }); 

您还可以获取所有响应标头的列表:

 xhr.getAllResponseHeaders() 

我想如果你举例说明:

 contentType: "text/html; charset=utf-8" 

在您的ajax请求中,如果发送的数据与您指定的MIME类型不匹配,请求将失败,我认为这是您处理此问题的方法。

有关更多信息,请查看jQuery文档的这一部分

也许你可以去看看beforeSend参数:

  $.ajax({ url: 'http://fiddle.jshell.net/favicon.png', beforeSend: function( xhr ) { xhr.overrideMimeType( 'text/html; charset=x-user-defined' ); }, success: function( data ) { if (console && console.log){ console.log( 'Sample of data:', data.slice(0,100) ); } } }); 

希望这可以帮助。