web-dev-qa-db-ja.com

document.addEventListener( 'load'、function)がgreasemonkeyスクリプトで機能しないのはなぜですか?

エラーは発生せず、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);
45

どうやら、document.addEventListener()は信頼できないため、私のエラーです。代わりに、window.addEventListener()と同じパラメーターを使用します。

79

問題はWHENイベントが追加されたときand実行済みトリガー経由(documentonloadプロパティの変更は、プロパティリストを調べることで確認できます)。

これは、onloadイベントトリガーに関連してonloadをいつ実行および変更しますか。

document.addEventListener('load', ... );

ページのHTMLのロードおよび/またはレンダリングの前、最中、または後に?
この単純なscURIple(URLにカットアンドペースト)は、alertingなしで単純に期待どおりに「機能」します。

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)
5
ekim

ページの読み込み時にドロップダウンボックスの値を取得するには、

document.addEventListener('DOMContentLoaded',fnName);

これが何らかの助けになることを願っています。

1
Bruce Tong

これは2017年の最後の四半期に再び起こりました。グリースモンキーの発射が遅すぎます。 domcontentloadedイベントが既に発生した後。

何をすべきか:

  • 文書終了の代わりに@run-at document-startを使用しました
  • firefoxを57に更新しました。

from: https://github.com/greasemonkey/greasemonkey/issues/2769

(プライベート)スクリプトライターとしても、なぜスクリプトが機能しないのか混乱しています。

最も可能性の高い問題は、スクリプトが実行される前に「DOMContentLoaded」イベントが発生することです。戻って@ run-at document-startが設定されていると言う前に、このディレクティブは現時点では完全にはサポートされていません。 WebExtensionsは非常に非同期であるため、いつ何かが実行されるかについての保証はほとんどありません。 FF59がロールバックすると、#2663が役立ちます。それは実際に多くのことを助け、デバッグもします。

0
bh_earth0