it-swarm.com.de

Warum funktioniert document.addEventListener (Funktion 'load') nicht in einem greasemonkey-Skript?

Es wird kein Fehler ausgegeben und ich füge eine console.log('loaded userscript wifi-autologin') hinzu, der console.log funktioniert, aber die beabsichtigte Wirkung des document.addEventListener tritt nicht auf. Nach etwas mehr Debugging und dem Ausdruck, dass der addEventListener aufgerufen wurde, habe ich festgestellt, dass er nicht aufgerufen wurde.

Quelle des Skripts:

// ==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);
41

Anscheinend ist document.addEventListener() unzuverlässig und daher mein Fehler. Verwenden Sie stattdessen window.addEventListener() mit den gleichen Parametern.

71

Das Problem ist [~ # ~], wenn [~ # ~] das Ereignis hinzugefügt wird und [~ # ~] ausgeführt [~ # ~] per Triggering (die Änderung der Eigenschaft documentonload kann anhand der Eigenschaftsliste überprüft werden).

Wann wird dies ausgeführt und onload relativ zum Ereignisauslöser onload geändert:

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

vor, während oder nach dem Laden und/oder Rendern der HTML-Seite?
Dieses einfache ScurIple (Ausschneiden & Einfügen in URL) "funktioniert" ohne alert erwartungsgemäß:

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>

Bedeutet das Laden, dass Skriptinhalte ausgeführt wurden?

Ein wenig aus dieser Welt Expansion ...
Betrachten Sie eine geringfügige Änderung:

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>

und ob das HTML geladen wurde oder nicht.

Das Rendern steht sicherlich noch aus, da goodbye universe - hello muiltiverse Nicht auf dem Bildschirm angezeigt wird, aber muss nicht die confirm( ... ) bereits geladen sein , um ausgeführt zu werden? ... und so document.addEventListener('load', ... ) ...?

Mit anderen Worten, können Sie Code ausführen, um zu überprüfen, ob er sich selbst lädt, wenn der Code selbst noch nicht geladen ist?

Oder eine andere Sichtweise auf die Situation: Wenn der Code ausführbar ist und ausgeführt wird, hat er [~ # ~] bereits [~ # ~] wurde als erledigter Deal geladen und nachträglich zu prüfen, wann der Übergang zwischen noch nicht geladen und geladen stattgefunden hat, ist a priori fait achiei .

Also, was kommt zuerst: Laden und Ausführen des Codes oder Verwenden der Funktionalität des Codes, obwohl nicht geladen?

onload als window - Eigenschaft funktioniert, weil sie dem Objekt untergeordnet und nicht selbstreferenziell ist, wie im Fall document, d. H. Es ist der Inhalt von window über document, der die geladene Frage-Fehler-Situation bestimmt.

PS .: Wann kann alert(...) nicht ausgeführt werden? (persönlich erfahrene Fallstricke):

ein vorbehalt: es sei denn, das laden in dasselbe fenster geht sehr schnell
also, was wirklich benötigt wird, wenn das gleichnamige Fenster verwendet wird:

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); 
                 /*  ...  */
                        } )
               } )
      } ) 

alternativ fahren Sie nacheinander mit window.open fort mit:
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>

die Unterschiede von onload als eine Eigenschaft von document oder window hervorheben.

Eine weitere Einschränkung betrifft das Beibehalten von XSS-, Cross Site Scripting- und SOP-Regeln (Same Origin Policy), mit denen möglicherweise ein HTML-URI geladen werden kann, der Inhalt jedoch nicht geändert wird, um ihn zu überprüfen. Wenn ein ScurIple als Bookmarklet/Scriplet von demselben Ursprung/derselben Site ausgeführt wird, ist dies möglicherweise erfolgreich.

dh Auf einer beliebigen Seite übernimmt dieser Link das Laden, aber wahrscheinlich nicht alert('done'):

    <a href="javascript:window.open('view-source:http://google.ca') . 
                   addEventListener( 'load',  function(){ alert('done') }  )"> src. vu </a>

wenn der Link jedoch mit einem Lesezeichen versehen und dann beim Anzeigen einer google.ca - Seite angeklickt wird, ist beides möglich.

test Umgebung:

 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

Um den Wert meines Dropdown-Feldes beim Laden der Seite zu ermitteln, verwende ich

document.addEventListener('DOMContentLoaded',fnName);

Hoffe das hilft jemandem.

1
Bruce Tong

dies geschah im letzten Quartal 2017 erneut. greasemonkey feuert zu spät. nachdem das domcontentloaded-Ereignis bereits ausgelöst wurde.

was ist zu tun:

  • ich habe @run-at document-start anstelle des Dokumentendes verwendet
  • firefox auf 57 aktualisiert.

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

Selbst als (privater) Drehbuchautor bin ich verwirrt, warum mein Skript nicht funktioniert.

Das wahrscheinlichste Problem ist, dass das 'DOMContentLoaded' Ereignis ausgelöst wird, bevor das Skript ausgeführt wird. Nun, bevor Sie zurückkommen und sagen, dass @ run-at document-start gesetzt ist, wird diese Direktive momentan nicht vollständig unterstützt. Aufgrund der sehr asynchronen Natur von WebExtensions gibt es keine Garantie dafür, wann etwas ausgeführt wird. Wenn FF59 herumrollt, haben wir # 2663, was helfen wird. Es hilft tatsächlich eine Menge Dinge und auch das Debuggen.

0
bh_earth0