body javascript greasemonkey addeventlistener

javascript - body - js document addeventlistener



¿Por qué no funciona document.addEventListener(''load'', function) en un script de greasemonkey? (3)

Aparentemente, document.addEventListener() no es confiable, y por lo tanto, mi error. Use window.addEventListener() con los mismos parámetros, en su lugar.

No da error, y puse console.log(''loaded userscript wifi-autologin'') , el console.log funciona, pero el efecto deseado del document.addEventListener no ocurre. Después de hacer un poco más de depuración, hacer que se imprima que se llamó a addEventListener, descubrí que no se estaba llamando.

Fuente de script:

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


El problema es CUANDO se agrega el evento y se EJECUTA mediante activación (la modificación de la propiedad de onload del document puede verificarse examinando la lista de propiedades).

¿Cuándo esto ejecuta y modifica onload relativo al desencadenador de eventos onload ?

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

antes, durante o después de la carga y / o renderización del HTML de la página?
Este simple scURIple (cortar y pegar a URL) "funciona" sin alert como ingenuamente esperado:

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>

¿La carga implica que los contenidos del script se han ejecutado?

Un poco fuera de esta expansión mundial ...
Considere una ligera modificación:

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>

y si el HTML se ha cargado o no.

La representación está ciertamente pendiente desde el goodbye universe - hello muiltiverse no se ve en la pantalla, pero, ¿no es necesario que la confirm( ... ) tenga que estar cargada para ser ejecutada? ... y entonces document.addEventListener(''load'', ... ) ...?

En otras palabras, ¿puede ejecutar código para verificar la carga automática cuando el código aún no está cargado?

O bien, otra forma de ver la situación, si el código es ejecutable y se ejecutó, YA se ha cargado como un trato hecho y para verificar retroactivamente cuándo se produjo la transición entre que aún no se cargó y se cargó es un hecho consumado a priori .

Entonces, ¿qué viene primero: cargar y ejecutar el código o usar la funcionalidad del código aunque no esté cargado?

onload como propiedad de window funciona porque está subordinado al objeto y no es autorreferencial como en el caso del document , es decir. es el contenido de la window , a través del document , lo que determina la situación cargada de la pregunta err.

PD .: ¿Cuándo los siguientes no alert(...) ? (experimentado personalmente gotcha''s):

advertencia: a menos que cargar a la misma ventana sea realmente rápido ... golpear es la orden del día
Entonces, ¿qué es realmente necesario a continuación cuando se usa la misma ventana con nombre?

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

alternativamente, proceda cada window.open sucesiva. window.open con:
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>

que enfatizan las diferencias de onload como una propiedad de document o window .

Otra advertencia se refiere a la preservación de las reglas XSS, Cross Site Scripting y SOP, Same Origin Policy, que pueden permitir cargar un URI HTML pero no modificar su contenido para comprobarlo. Si un scURIple se ejecuta como bookmarklet / scriplet del mismo origen / sitio, entonces puede haber éxito.

es decir. Desde una página arbitraria, este enlace hará la carga pero no es probable que haga una alert(''done'') :

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

pero si el enlace está marcado como favorito y luego se hace clic al visualizar una página de google.ca , hace ambas cosas.

entorno de prueba:

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)


esto sucedió otra vez alrededor del último trimestre de 2017. greasemonkey disparando demasiado tarde. después de que el evento domcontentloaded ya haya sido disparado.

qué hacer:

  • utilicé @run-at document-start lugar de document-end
  • actualizado Firefox a 57.

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

Incluso como guionista (privado), estoy confundido sobre por qué mi guión no funciona.

El problema más probable es que el evento ''DOMContentLoaded'' se active antes de ejecutar el script. Ahora, antes de volver y decir @ run-at document-start, esa directiva no es totalmente compatible en este momento. Debido a la naturaleza asincrónica de WebExtensions, hay poca garantía sobre cuándo se ejecutará algo. Cuando llegue FF59, tendremos # 2663, lo que ayudará. Realmente ayudará a muchas cosas, depurando también.