无法使用通过调用getResponseHeader获得的值

时间:2012-05-14 08:48:24

标签: javascript xmlhttprequest greasemonkey getresponse

我在使用我的Greasemonkey脚本上调用getResponseHeader时获得的值时遇到问题。

首先,我宣布了以下全局变量:

size = 0;
maxS = 153600; // Max. size (bytes).

一旦网站被完全加载,我的主函数被调用,在其中我得到某个div内的所有图像(这里没有显示,因为它不相关):

function main() {
    ...
    var imgs = posts[i].getElementsByTagName('img');
    for (var j = 0; j < imgs.length; ++j) {
        getFileSize(imgs[j].src, responseHandler);
        if (size > maxS)
            // Do something
    }
    ...
}

这就是getFileSize的工作原理:

var getFileSize = function(address, responseHandler) {
    var req = new XMLHttpRequest();
    req.open('head', address, true);
    req.onreadystatechange = responseHandler;
    req.send(null);
};

var responseHandler = function(resp) {
    if (this.readyState == 1)
    this.abort();
    size = this.getResponseHeader("Content-length");
};

问题在于,即使我在句子后检查 size 的值

size = this.getResponseHeader("Content-length");

该值是我期望的值,在main函数中,当它到达代码的这一部分时,它的值仍为0:

if (size > maxS)
    // Do something

我试着通过查看我在本网站上找到的其他一些问题找出答案,我猜测它与同步有关但我真的不知道如何解决这个问题

1 个答案:

答案 0 :(得分:2)

图像都在完全相同的服务器上,对吗? XMLHttpRequest()不会执行跨域请求(无论如何都不会在Greasemonkey上下文中应用一些新的箍)。

该代码存在一些问题:

  1. 它希望同步设置大小,但异步调用XMLHttpRequest()
  2. 中止请求!太快了。没有充分理由中止HEAD请求。
  3. 它以模糊的方式使用“幻数”。使用适当的枚举常量(如果可用)。 EG this.readyState == 1很糟糕。 this.readyState == this.OPENED更好。

  4. 对于同步操作,请更改getFileSize()。像这样称呼它:

    getFileSize (imgs[j].src);
    

    如此定义:

    function getFileSize (address) {
        var request = new XMLHttpRequest();  
        request.open ('HEAD', address, false);  //-- false = Synchronous
        request.send (null);  
    
        size        = -666; // Error, or AJAX fail.
        if (request.status === 200) {  
            size    = request.getResponseHeader ("Content-length");
        }  
    }
    



    注意:

    1. 出于性能和用户友好性的原因,重构使用异步AJAX的方法会更好。但这是另一个问题而且不太直观。
    2. 如果图片是跨域的,则需要使用GM_xmlhttpRequest() - 其操作略有不同,并且对于同步AJAX无法正常工作(最后我检查过 - 几个月前)。