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

标签 jquery ajax http content-type xmlhttprequest

我正在制作一个基于 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/

相关文章:

.each() 的 jQuery 反向排序

jquery - 限制 html5 Canvas 内的移动?

javascript - 使用 jQuery 修改表单按钮

javascript - jquery ajax get with serialize on success get url compiled

javascript - JSON.Stringify 为 ID 添加引号

javascript - AJAX 无法在另一个页面上正常工作

PHP 发布到 REST Web 服务

javascript - 如何从 AJAX 请求返回值?

api - 通过 HTTP 从纪元获取毫秒数

c - 需要实时可嵌入的 http 服务器库