我在使用我的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
我试着通过查看我在本网站上找到的其他一些问题找出答案,我猜测它与同步有关但我真的不知道如何解决这个问题
答案 0 :(得分:2)
图像都在完全相同的服务器上,对吗? 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");
}
}
注意:
GM_xmlhttpRequest()
- 其操作略有不同,并且对于同步AJAX无法正常工作(最后我检查过 - 几个月前)。