このコードは Chrome で正常に動作します。ただし、Firefox では、GMxhr リクエストにヒットすると、単純に停止します。GMxhr 呼び出しに到達し、その後... 停止します。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 を書き換え、イベントを発生させ、開始します。
また、log(1) 呼び出しと同じ場所にある gmXOptions のディレクトリを使用して、Firefox がすべて正しいことを確認しました。
ファイアフォックス:
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 を使用する (GM コンテキスト) 関数と main の関数 (注入された、非-GM コンテキスト)、この場合はイベント付きです。
結果) GM 用語では、unsafeWindow は GM_xmlhttpRequest を呼び出しています。これにより、Firefox Greasemonkey の「セキュリティ」がトリガーされ、 GM_xmlhttpRequest への呼び出しが黙ってブロックされます。回避策を使用して、スタックを十分に「クリーンアップ」し、Firefox GM の「セキュリティ」を満足させる必要があります。次に、GM_xmlhttpRequestを呼び出します。