2

このコードは 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を呼び出します。

4

1 に答える 1

2

私は最終的に問題を発見しました.

とにかく、これが問題でした: http://wiki.greasespot.net/0.7.20080121.0_compatibility

追加

 setTimeout(function() {

}, 0);

GM_xhr 呼び出しの周りで、すべてが正常に機能するようになりました。

于 2012-06-13T13:15:12.260 に答える