キー| 価値
-| -
システムプラットフォーム| AMD64、Windows-10-10.0.14393
ブラウザ| Firefox Developer Edition(55.0 Beta 1、64ビット)
ユーザーエージェント| Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv:55.0)Gecko / 20100101 Firefox / 55.0
ビルド構成| https://hg.mozilla.org/releases/mozilla-beta/rev/6872377277a618b2b9e0d2b4c2b9e51765ac199e
グリースモンキー| 3.11
// ==UserScript==
// <strong i="15">@name</strong> HeadTest
// <strong i="16">@namespace</strong> HeadTest
// <strong i="17">@include</strong> *
// @run-at document-start
// <strong i="18">@version</strong> 1
// <strong i="19">@grant</strong> none
// ==/UserScript==
AddGlobalStyle('body{background-color:red;}');
function AddGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName("head")[0];
console.log("[Test]: Head: %o", head); //DEBUG
console.log("[Test]: document.head: %o", document.head); //DEBUG
}
[Test]: Head: <head>
[Test]: document.head: <head>
[Test]: Head: undefined
[Test]: document.head: null
この問題はGM_addStyle
にも当てはまります
最後の良い点:Firefox 55.0a1(2017-03-17)
https://hg.mozilla.org/mozilla-central/rev/39607304b774591fa6e32c4b06158d869483c312からビルド
最初の悪い点:Firefox 55.0a1(2017-03-17)
https://hg.mozilla.org/mozilla-central/rev/23a4b7430dd7e83a2809bf3dc41471f154301edaからビルド
バグ1333990が容疑者です。
#1849も参照してください
@janekptacijarabaci回避策が見つかりました:
setTimeout(()=>{
AddGlobalStyle('body{background-color:red;}');
});
それは不安定で信頼できないように見えますが、それは物事を機能させる現在私が見つけることができる最も簡単な方法です。
これはバグではないと思います。 document-start
は非常に早い段階で発生します。 これにより、コンテンツjavascriptが実行される前に、ユーザースクリプトがページを操作できるようになります。
後で実行する場合は、 document-end
を使用するか、ミューテーションオブザーバーを使用して特定の要素が挿入されるのを待ちます。
@ the8472
多分あなたは正しいです。
MDNによると:
ドキュメント要素が挿入されました
ドキュメントのルート要素が作成された直後、ただしスクリプトを実行する前に送信されます。
document-start
( document-element-inserted
に基づく)は、 <html></html>
が作成された直後に発生します。このとき、 <head>
はnullです。
ただし、これにより、ページがレンダリングされる前にスタイルを追加しようとする多くのスクリプトが壊れます( GM_addstyle
をdocument-end
で使用すると、ページが点滅していることに気付くでしょう)。
これが意図的に行われているのかわかりません
GM_addStyleはとにかくばかげています<style>
タグを<head>
に挿入するだけです。必要に応じて、ミューテーションオブザーバーを使用して、自分でそれを行うことができます。
しかし、それが実際の懸念事項である場合は、パッチを適用して、 <head>
の存在を確認し、存在しない場合はオブザーバーを使用することができます。
@ the8472現在のdocument-start
の動作が正しく、意図的に行われている場合は、スタイルを追加する必要があるたびにオブザーバーを使用する必要があります
何かのようなもの
function addGlobalStyle(css){
let headHunter = new MutationObserver(
records => {
; check mutation records
; is added node's tag name 'head'?
; create a style node then throw it in
; then disconnect us
}
);
headhunter.observer(document, {childlist : true});
}
document-end
の前にスタイルを追加するすべてのスクリプトに必要です。 つまらない。
GM_addstyle
が私のためにそれを行うか、wikiにいくつかの有用な警告を書くことができることを願っています(「GM_addstyleは@ run-at document-startのスクリプトでは使用できません、使用しないでください」、自分で解決策を見つけてください"など)
はい、gm_addstyleを修正する必要があります。
ただし、スクリプトが実行する可能性のある他のすべてのことも、ドキュメントの開始時に同じフープをジャンプして、その点で特別ではないスタイルを追加する必要があります。 利用できるDOMはないため、必要なものは何でも待つ必要があります。 つまり、ドキュメントの開始時に実行する場合は、とにかくオブザーバーを使用する必要があります。
詳細なレポートをありがとうございますが、これはWAIであり、3.xブランチはとにかく死んでいます。 (私は、たとえば、新しいWeb拡張機能の大君主を歓迎します。) GM_addStyle
のようなものは、4.xに存在しないことで修正されます。
https://arantius.com/misc/greasemonkey/amazon-url-cleaner.user.jsのような、DOMをまったく必要としないスクリプトが存在するため、できるだけ早く実行する必要があります。
最も参考になるコメント
@ the8472現在の
document-start
の動作が正しく、意図的に行われている場合は、スタイルを追加する必要があるたびにオブザーバーを使用する必要があります何かのようなもの
document-end
の前にスタイルを追加するすべてのスクリプトに必要です。 つまらない。GM_addstyle
が私のためにそれを行うか、wikiにいくつかの有用な警告を書くことができることを願っています(「GM_addstyleは@ run-at document-startのスクリプトでは使用できません、使用しないでください」、自分で解決策を見つけてください"など)