2

此代码在 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 上只得到“1”。在 Chrome 中,我得到“1”、“2”,它重写了 innerHTML,触发了事件,然后我们就走了。

我还检查以确保 Firefox 一切正常,gmXOptions 的目录与 log(1) 调用位于同一位置:

火狐:

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 函数。所以你必须把它们放在脚本的开头,在 main() 之外,在你注入 jQuery 之前,然后在那些使用 GM 的(一个 GM 上下文)函数和 main 中的函数(一个注入的,非-GM 上下文),在这种情况下带有事件。

结果)在 GM 术语中,unsafeWindow 正在调用 GM_xmlhttpRequest。这会触发 Firefox Greasemonkey 中的“安全性”,它会默默地阻止对 GM_xmlhttpRequest 的调用。您必须使用解决方法来“清理”堆栈以使 Firefox GM 的“安全性”满意。然后它调用 GM_xmlhttpRequest。

4

1 回答 1

2

我终于找到了问题,尽管 Firefox Greasemonkey 真的很难找到,而且无论出于何种原因,它根本没有抛出任何错误/警告/等消息,这可能有助于更快地解决这个问题。

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

添加

 setTimeout(function() {

}, 0);

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

于 2012-06-13T13:15:12.260 回答