1

<img>次のインジェクションは Chrome で完全に機能しますが、最新の Firefox (バージョン 21) では、ドキュメントは "接続中..." のままで、ロードなどの要素さえありません。(しかし、リロードをクリックすると、問題なく表示されます...)

スクリーンショット:
問題のスクリーンショット

脚本:

// ==UserScript==
// @name            Test
// @namespace       Test
// @author          Owyn
// @match           http://*
// ==/UserScript==

function inject(func) {
    var source = func.toString();
    var script = document.createElement('script');
    script.innerHTML = "("+ source +")()";
    document.body.appendChild(script);
}

function myf() {
  document.write('<html>TEST</html>');
}

inject(myf);

修正、回避策はありますか? バグについて Mozilla に連絡する必要がありますか?

PS - document.write を使用してすべてのイベント リスナー (私には不明) を削除しましたが、それに代わるものはまだ見つかりませんでした。

4

1 に答える 1

4

最も賢い/最善の(最も)ことは、避けることdocument.write()です。 DOM テクニックを使用します完全なスクリプトは次のとおりです。

// ==UserScript==
// @name     _Replace a target page using DOM techniques
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
var D       = document;
var newDoc  = D.implementation.createHTMLDocument ("");

D.replaceChild (
    D.importNode (newDoc.documentElement, true),
    D.documentElement
);

D.body.innerHTML = '<h1>TEST</h1>'



Greasemonkey は通常、ページの読み込みが完全に完了したときDOMContentLoadedではなく、 で起動します。デフォルトでは、Chrome はそれよりも遅く起動します。

とにかく、でDOMContentLoaded、Firefox で。現在のドキュメントをゴミ箱に移動すると、何かが孤立します。したがって、「throbber」が停止されることはなく、他のクリーンアップがおそらく見逃されます。

これはおそらくバグですが、document.write()とにかく使用しないでください。また、 DOCに従って、電話する必要がありますdocument.close()

汚い回避策は、ページが読み込まれるまで待機してから起動することです。したがって、inject(myf);直接呼び出す代わりに、次のように呼び出します。

function myf () {
  document.write ('<html>TEST</html>');
  document.close ();
}

window.addEventListener ("load", function () { inject(myf); }, false);


代わりに DOM メソッドを使用してください。 それらはより高速になり、エッジケースのバグやセキュリティ違反を引き起こすことはありません.

于 2013-06-03T11:34:39.590 に答える