2017-11-24 1 views
3

Firefox 57とGreasemonkey 4のアップデートで、私のuserscriptsの数が壊れました。いくつかのスクリプトで私は使用しました:Greasemonkey 4のDOMでコードを実行するにはどうすればいいですか?

document.addEventListener('DOMContentLoaded', doStuff, false); 

これはGreasemonkeyでは動作しません。今すぐDOMContentLoadedイベントを追加する適切な方法は何ですか?

P.S.私は、イベントの登録時に、DOMはまだ準備ができていないことを確認しました。

答えて

2

私はまだDOM上のコードを実行しているの推奨方法はGreasemonkeyの4で準備ができているのか分からないが、変更後:

document.addEventListener('DOMContentLoaded', doStuff, false); 

へ:

window.addEventListener('load', doStuff, false); 

私のスクリプトが再び動作します。このanswerに基づいて他のメソッドをテストし始めたのは、jQueryベースのユーザースクリプトがまだ動作していることに気づきました(少なくともDOM対応の部分ではそうです)。

この回答は明らかですが、質問を書いている時点で私はGreasemonkey(すべての非同期のものについて読んでいます)の変更について行っているかどうか確信がなく、DOMContentLoadedがうまく動作すると予想しました。

+0

'@ run-at document-end'を試しましたか? – peterh

1

のGreaseMonkeyがバージョン4にアップグレードした後、私は同様の問題に走ったが、私が代わりに

addEventListener("DOMContentLoaded", function(){ 
    // … 
}); 

を使用。私のユーザースクリプトを修正しようとすると

、私は当初、そのラッパーをコメントアウトし、metadata block

// @run-at document-end 

を置きます。このようにして、私はDOMが準備できて、元々DOMContentLoadedラッパーの中にあったコードが正しく実行されたことを確認しました。

しかし、実際にJavaScriptを実行する必要があった2つのユーザースクリプトでは、ページスクリプトが実行される前にが実行されていました。それは今あなたのことを、判明あなたwindow(またはdocument)上で動作するようにDOMContentLoadedラッパーのために、メタデータブロックに

// @run-at document-start 

を配置する必要がありを。

以前のバージョンのGreaseMonkeyではこれを省略しても問題ありませんでした。

GreaseSpot Wikiによれば、おそらく非同期的な実行やアドオンのWebExtensionsリライトの機能がないために、document-startはGreaseMonkey 4.0で動作するとは限りません。

また、document.readyStatedocument-endまたはまったく// @run-atdocument-start"loading"が、"interactive"になります。

+0

興味深い!私の場合、トリックはaddEventListener関数を削除することでした。無名関数の内部にあったものをコピーしました。また、@ run-at setもありません。以前のバージョンのGreasemonkeyではaddEventListener関数を使用しなければなりませんでしたが、現在は省略されているすべての関数で動作します。 – Yani2000

+0

@ Yani2000それは私のためにも機能しましたが、DOMがロードされる前と実行後のコードを区別する必要のないスクリプトでのみ役に立ちました。 – Xufox

関連する問題