エラーは発生せず、console.log('loaded userscript wifi-autologin')
を配置し、console.log
は機能しますが、document.addEventListenerの意図した効果は発生しません。もう少しデバッグを行って、addEventListenerが呼び出されたことを表示させたところ、呼び出されていないことがわかりました。
スクリプトのソース:
// ==UserScript==
// @name wifi-autologin
// @namespace lf-ns
// @description Hopefully autologins to a captive portal
// @include *://1.1.1.1/*
// @version 1
// @run-at document-end
// ==/UserScript==
document.addEventListener('load', submitAction);
どうやら、document.addEventListener()
は信頼できないため、私のエラーです。代わりに、window.addEventListener()
と同じパラメーターを使用します。
問題はWHENイベントが追加されたときand実行済みトリガー経由(document
onload
プロパティの変更は、プロパティリストを調べることで確認できます)。
これは、onload
イベントトリガーに関連してonload
をいつ実行および変更しますか。
document.addEventListener('load', ... );
ページのHTMLのロードおよび/またはレンダリングの前、最中、または後に?
この単純なscURIple(URLにカットアンドペースト)は、alert
ingなしで単純に期待どおりに「機能」します。
data:text/html;charset=utf-8,
<html content editable><head>
<script>
document.addEventListener('load', function(){ alert(42) } );
</script>
</head><body>goodbye universe - hello muiltiverse</body>
</html>
ロードは、スクリプトのコンテンツが実行されたことを意味しますか?
この世界展開の少し...
わずかな変更を検討してください。
data:text/html;charset=utf-8,
<html content editable><head>
<script>
if(confirm("expand mind?"))document.addEventListener('load', function(){ alert(42) } );
</script>
</head><body>goodbye universe - hello muiltiverse</body>
</html>
hTMLがロードされているかどうか。
goodbye universe - hello muiltiverse
は画面に表示されないため、レンダリングは確実に保留されますが、実行するためにconfirm( ... )
をalreadyにロードする必要はありませんか? ...そしてdocument.addEventListener('load', ... )
...?
つまり、コード自体がまだロードされていないときに、コードを実行してセルフロードをチェックできますか?
または、状況を見る別の方法、コードが実行可能で実行されている場合、ALREADYがロードされている完了した取引として、およびまだロードされていないロードとロードされている間で遷移がいつ発生したかを遡及的にチェックすることは、aアプリオリフェイトのaccompliです。
コードのロードと実行、またはロードされていなくてもコードの機能を使用するのはどちらですか?
onload
プロパティとしてのwindow
は、オブジェクトに従属し、document
の場合のように自己参照ではないため、機能します。ロードされた質問のエラー状況を決定するのは、window
を介したdocument
のコンテンツです。
PS .: alert(...)
が失敗するのはいつですか? (個人的に経験した落とし穴):
警告:同じウィンドウへの読み込みが本当に速い場合を除き...破壊はその日の順序です
そのため、同じ名前のウィンドウを使用する場合に実際に必要なもの:
window.open(URIstr1,"w") .
addEventListener('load',
function(){ alert(42);
window.open(URIstr2,"w") .
addEventListener('load',
function(){ alert(43);
window.open(URIstr3,"w") .
addEventListener('load',
function(){ alert(44);
/* ... */
} )
} )
} )
または、次の各window.open
を続行します。alert("press Ok either after # alert shows pending load is done or inspired via divine intervention" );
data:text/html;charset=utf-8,
<html content editable><head><!-- tagging fluff --><script>
window.open(
"data:text/plain, has no DOM or" ,"Window"
) . addEventListener('load', function(){ alert(42) } )
window.open(
"data:text/plain, has no DOM but" ,"Window"
) . addEventListener('load', function(){ alert(4) } )
window.open(
"data:text/html,<html><body>has DOM and", "Window"
) . addEventListener('load', function(){ alert(2) } )
window.open(
"data:text/html,<html><body>has DOM and", "noWindow"
) . addEventListener('load', function(){ alert(1) } )
/* etc. including where body has onload=... in each appropriate open */
</script><!-- terminating fluff --></head></html>
onload
またはdocument
プロパティとしてwindow
の違いを強調します。
別の警告は、XSS、クロスサイトスクリプティング、およびSOPを保存することに関するもので、HTML URIの読み込みは許可するが、同じコンテンツを確認するためのコンテンツの変更は許可しない可能性があります。 scURIpleが同じOrigin /サイトからブックマークレット/スクリプレットとして実行される場合、成功する可能性があります。
すなわち。任意のページから、このリンクはロードを行いますが、おそらくalert('done')
は行いません:
<a href="javascript:window.open('view-source:http://google.ca') .
addEventListener( 'load', function(){ alert('done') } )"> src. vu </a>
ただし、google.ca
ページを表示するときにリンクにブックマークを付けてクリックすると、両方が実行されます。
テスト環境:
window.navigator.userAgent =
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (Splashtop-v1.2.17.0)
ページの読み込み時にドロップダウンボックスの値を取得するには、
document.addEventListener('DOMContentLoaded',fnName);
これが何らかの助けになることを願っています。
これは2017年の最後の四半期に再び起こりました。グリースモンキーの発射が遅すぎます。 domcontentloadedイベントが既に発生した後。
何をすべきか:
@run-at document-start
を使用しましたfrom: https://github.com/greasemonkey/greasemonkey/issues/2769
(プライベート)スクリプトライターとしても、なぜスクリプトが機能しないのか混乱しています。
最も可能性の高い問題は、スクリプトが実行される前に「DOMContentLoaded」イベントが発生することです。戻って@ run-at document-startが設定されていると言う前に、このディレクティブは現時点では完全にはサポートされていません。 WebExtensionsは非常に非同期であるため、いつ何かが実行されるかについての保証はほとんどありません。 FF59がロールバックすると、#2663が役立ちます。それは実際に多くのことを助け、デバッグもします。