Javascript Can';t使用通过调用getResponseHeader获得的值

Javascript Can';t使用通过调用getResponseHeader获得的值,javascript,xmlhttprequest,greasemonkey,getresponse,Javascript,Xmlhttprequest,Greasemonkey,Getresponse,在对Greasemonkey脚本调用getResponseHeader时,我无法使用获得的值 首先,我声明了以下全局变量: size = 0; maxS = 153600; // Max. size (bytes). 一旦网站被完全加载,我的主要功能被调用,在其中我得到某个div中的所有图像(此处不显示,因为它不相关): 问题是,即使我在句子后检查大小的值 size = this.getResponseHeader("Content-length"); 该值是我期望的值,在主函数中,当它到达

在对Greasemonkey脚本调用
getResponseHeader
时,我无法使用获得的值

首先,我声明了以下全局变量:

size = 0;
maxS = 153600; // Max. size (bytes).
一旦网站被完全加载,我的主要功能被调用,在其中我得到某个div中的所有图像(此处不显示,因为它不相关):

问题是,即使我在句子后检查大小的值

size = this.getResponseHeader("Content-length");
该值是我期望的值,在主函数中,当它到达代码的这一部分时,其值仍然为0:

if (size > maxS)
    // Do something

我试图通过检查我在这个网站上发现的一些其他问题来找出答案,我猜这与同步有关,但我真的不知道如何解决这个问题。

图像都在同一台服务器上,对吗
XMLHttpRequest()
将不会执行跨域请求(没有一些新的环,这些环无论如何都不适用于Greasemonkey上下文)

该代码存在一些问题:

  • 它希望同步设置大小,但异步调用
    XMLHttpRequest()
  • 它中止了请求!而且太早了。没有很好的理由中止
    HEAD
    请求
  • 它以一种模糊的方式使用“幻数”。如果可用,请使用适当的枚举常量。例如
    this.readyState==1
    不正确
    this.readyState==this.OPENED
    更好

  • 对于同步操作,请更改
    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");
        }  
    }
    
    定义如下:

    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");
        }  
    }
    


    注:

  • 出于性能和用户友好的原因,最好重构该方法以使用异步AJAX。但这是另一个问题,不那么直观
  • 如果图像是跨域的,则需要使用
    GM\u xmlhttpRequest()
    ——它的操作稍有不同,对于同步AJAX来说无法正常工作(我上次检查时是几个月前)
    非常感谢你!你的回答对我很有帮助,很有启发性,问题已经解决了。很抱歉,我不能投你的票,因为我没有足够的声誉。很高兴你的问题解决了!此外,你可能还不能投票,但如果这对你有帮助,你可以。