背景故事
我编写了一个专门的图像内联脚本,旨在与GreaseMonkey和Google Chrome一起使用。 它应该下载PNG文件并将它们存储在图像src
属性中的data:
URL中。 这听起来可能很荒谬,但某个网站Content-Disposition
设置为attachment
图像,我不希望每次都弹出"另存为"对话框。
实际问题
该脚本使用XMLHttpRequest
获取数据,将其编码为base64并将其存储在适当的位置。 到目前为止,很好。 但是它仅在我通过Firebug和Chrome开发控制台运行时有效,而当我将其用作适当的用户脚本时则无效。 据我了解,这是因为 Greasemonkey 脚本不能直接使用XMLHttpRequest
对象,而应该依赖于对GM_xmlhttpRequest
的调用。 但是,我无法以这种方式将responseType
设置为 "blob"
或"arraybuffer"
,并且 binary
参数似乎仅适用于通过 POST 请求发送数据。 我只得到 Unicode 字符串。
以防万一,图像来自与链接到它们的页面相同的域。 我相信它满足了"同源"的东西。
http://wiki.greasespot.net/GM_xmlhttpRequest 这里是GM_xmlhttpRequest文档。
有没有办法从 Greasemonkey 用户脚本中获取arraybuffer
?
如果是同域,那么您可以使用 XMLHttpRequest
,没有问题。 使用GM_xmlhttpRequest
(目前功能子集残缺)的唯一原因是图像/文件是跨域的。
对于同一域,您可以使用 XHR2,如本答案所示。
对于跨域,您必须:使用 GM_xmlhttpRequest
,覆盖 mime 类型,并使用自定义编码器算法。 同样,这一切都显示在同一个答案中。
但是,听起来您只是想更轻松地下载图像? 如果是这样,那么你最好只使用优秀的DownThemAll扩展。
覆盖Mime类型字符串(兼容性:0.6.8+)可选。MIME 类型 与请求一起指定(例如"文本/html;字符集=ISO-8859-1")。
您可以将其设置为 plain/text; charset=x-user-defined
(类型无关紧要,但字符集很重要),按位 AND 通过响应字符串并将值添加到类型化数组并获取缓冲区:
var text = xhr.responseText,
len = text.length,
arr = new Uint8Array(len),
i = 0;
for( i = 0; i < len; ++i ) {
arr[i] = text.charCodeAt(i) & 0xFF;
}
arr.buffer //The arraybuffer
注意:这适用于原始二进制响应,而不是base64。