GM_xmlhttpRequest:为什么它永远不会在Firefox中启动onload?

时间:2012-06-13 02:50:08

标签: javascript firefox greasemonkey

此代码在Chrome中运行良好。但是,在Firefox中,当它遇到GMxhr请求时,它就会停止。它接通GMxhr电话,然后......停止。我已经检查了我能想到的一切,确保只为chrome等设置了responseType参数......但仍然没有。有什么想法吗?

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上只获得“1”。在Chrome中,我得到“1”,“2”,它会重写innerHTML,触发事件,然后我们离开。

我还检查过以确保Firefox的所有内容都正确,并且在log(1)调用的同一位置使用gmXOptions目录:

火狐:

method  "GET"
overrideMimeType    "text/plain; charset=x-user-defined"
url     "http://www.home...e-and-land-packages.jpg"
onload      storeRetrievedFile(response)

编辑解释答案;也许这将在未来帮助别人:

Firefox的GM有一个恼人的行为/错误:

1)编写附加事件监听器的用户脚本。在该事件监听器函数中,例如上面的getUri(),使用GM_函数。

2)现在从任何其他javascript上下文)中调用该事件的触发器,用于刚刚创建了侦听器的触发器。例如,使用常见的Chrome友好的“注入jquery,回调到main(),继续”模式。

3)但是这样做会导致您无法访问main()中的GM功能。因此,在注入jQuery之前,必须将它们放在main()之外的脚本开头,然后在那些GM-using(GM上下文)函数和main中的函数之间进行“通信”(注入,非-GM context),在这种情况下是w / events。

结果)在GM术语中,unsafeWindow正在调用GM_xmlhttpRequest。这触发了Firefox Greasemonkey中的“安全性”,并且默默地阻止对GM_xmlhttpRequest的调用。您必须使用该解决方法来使堆栈“清理”到足以使Firefox GM的“安全性”高兴。然后调用GM_xmlhttpRequest。

1 个答案:

答案 0 :(得分:2)

我终于找到了问题,虽然Firefox Greasemonkey非常难以找到,无论出于何种原因,它根本没有丢弃任何错误/警告/等消息,这可能有助于更快地解决这个问题。

无论如何,这就是问题所在:http://wiki.greasespot.net/0.7.20080121.0_compatibility

添加

 setTimeout(function() {

}, 0);

围绕GM_xhr调用,现在一切正常。