Javascript GM_xmlhttpRequest:为什么它从不在Firefox中启动onload?
这段代码在Chrome中运行良好。然而,在Firefox中,当它点击GMxhr请求时,它只是停止。它直接到达GMxhr调用,然后。。。停止。我已经检查了我能想到的一切,确保responseType参数只为chrome设置,等等。。。但还是什么都没有。有什么想法吗Javascript GM_xmlhttpRequest:为什么它从不在Firefox中启动onload?,javascript,firefox,greasemonkey,Javascript,Firefox,Greasemonkey,这段代码在Chrome中运行良好。然而,在Firefox中,当它点击GMxhr请求时,它只是停止。它直接到达GMxhr调用,然后。。。停止。我已经检查了我能想到的一切,确保responseType参数只为chrome设置,等等。。。但还是什么都没有。有什么想法吗 var body = document.getElementsByTagName('body')[0] , messageDiv = document.createElement('div') ; messageD
var body = document.getElementsByTagName('body')[0]
, messageDiv = document.createElement('div')
;
messageDiv.id = 'xhrComlink';
body.appendChild(messageDiv);
function getUri(e) {
'use strict';
var chrome = navigator.userAgent.toString().toLowerCase().indexOf('chrome') !== -1;
var bin2base64 = function bin2base64 (binary) {
...
};
var storeRetrievedFile = function storeRetrievedFile(response) {
console.log(2);
var thisComlink = e.target
, evt = document.createEvent("MouseEvents")
;
var text = response.responseText
, len = text.length
, arr = new Uint8Array(len)
, i = 0
;
if (!chrome) {
for( i = 0; i < len; ++i ) {
arr[i] = text.charCodeAt(i) & 0xFF;
}
}
thisComlink.innerHTML = '';
thisComlink.appendChild(
document.createTextNode(
chrome ? bin2base64(response.responseText) : bin2base64(arr.buffer)
)
);
evt.initMouseEvent("dblclick", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
thisComlink.dispatchEvent(evt);
};
var gmXOptions = { method : 'GET'
, overrideMimeType : 'text/plain; charset=x-user-defined'
, onload : storeRetrievedFile
, url : e.target.innerHTML
};
chrome && (gmXOptions.responseType = 'arraybuffer');
console.log(1);
GM_xmlhttpRequest(gmXOptions);
}
编辑以解释答案;也许这会在将来帮助其他人:
Firefox的GM有一个恼人的行为/错误:
1) 编写一个附加事件侦听器的用户脚本。在该事件中,侦听器函数(如上面的getUri())使用GM_u函数
2) 现在从任何其他javascript上下文调用该事件的触发器,除了刚刚创建侦听器的javascript上下文。例如,使用常见的对Chrome友好的“injectjQuery,callbacktomain(),continue”模式
3) 但这样做,您将无法访问main()中的GM函数。因此,在注入jQuery之前,必须将它们放在脚本的开头,main()之外,然后使用(GM上下文)函数和main中的函数(注入的非GM上下文)在这些GM之间进行“通信”,在本例中是带事件的
结果)在GM术语中,unsafeWindow调用GM_xmlhttpRequest。这会触发Firefox Greasemonkey中的“安全性”,并且它会无声地阻止对GM_xmlhttpRequest的调用。您必须使用变通方法来充分“清理”堆栈,以使Firefox GM的“安全性”满意。然后它将调用gmxmlHttpRequest。我终于找到了问题,尽管Firefox Greasemonkey让它很难找到,而且无论出于什么原因,它根本没有抛出任何错误/警告/etc消息,这可能有助于更快地解决这个问题 无论如何,这就是问题所在: 加 及
关于GM_xhr调用,现在一切都正常了。除非您试图将代码注入到页面中,否则该注释不适用——这在问题中没有显示。问题代码(仍然)不准确和/或您在添加超时时碰巧解决了问题。实际上,问题中显示了这一点-根据定义,用户脚本被注入页面。GM_xmlhttpRequest不存在于userscript上下文之外。不,userscript不被注入,它在沙箱中运行,除非您显式地注入它——这在问题中没有显示。该注释不适用于您发布的问题。用户脚本被注入到页面、沙盒或“否”中。如果不是,它将不存在于任何地方:P参考文献[1]O'Reilly:“Greasemonkey将用户脚本注入页面”,参考文献[2]Google:“默认情况下,Greasemonkey脚本被注入一个名为“文档空闲”的新点。这与Greasemonkey不同,Greasemonkey总是在文档末尾注入。”参考文献[3,4]:GM和我的问题是使用
/@grant none
而不是/@grant GM\u xmlhttpRequest
。
method "GET"
overrideMimeType "text/plain; charset=x-user-defined"
url "http://www.home...e-and-land-packages.jpg"
onload storeRetrievedFile(response)
setTimeout(function() {
}, 0);