此代码在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。
答案 0 :(得分:2)
我终于找到了问题,虽然Firefox Greasemonkey非常难以找到,无论出于何种原因,它根本没有丢弃任何错误/警告/等消息,这可能有助于更快地解决这个问题。
无论如何,这就是问题所在:http://wiki.greasespot.net/0.7.20080121.0_compatibility
添加
setTimeout(function() {
和
}, 0);
围绕GM_xhr调用,现在一切正常。