Javascript GM_xmlhttpRequest:为什么它从不在Firefox中启动onload?

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

这段代码在Chrome中运行良好。然而,在Firefox中,当它点击GMxhr请求时,它只是停止。它直接到达GMxhr调用,然后。。。停止。我已经检查了我能想到的一切,确保responseType参数只为chrome设置,等等。。。但还是什么都没有。有什么想法吗

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