scripts script monkey grease chrome javascript firefox firefox-addon greasemonkey

javascript - chrome - script greasemonkey



¿Cómo ejecutar el script greasemonkey antes de que se muestre el contenido de la página? (3)

Estoy escribiendo un complemento para Firefox y usando el script greasemonkey para hacer eso (compilo el script del usuario usando esta herramienta http://arantius.com/misc/greasemonkey/script-compiler ).

El problema es que el script se ejecuta después de que la página está completamente cargada. Lo que significa que el usuario vería la página vista en su forma original y luego la secuencia de comandos aplicará los cambios que hice. Mi pregunta es si hay alguna manera de ejecutar el script del usuario antes de que el contenido de la página se muestre al usuario, por lo que el usuario solo vería la versión final del sitio web.


Además de las respuestas anteriores, encontré una solución que funciona sin problemas, al igual que las versiones anteriores de Firefox y GreaseMonkey. En primer lugar, run-at debe establecerse en el momento más temprano, por lo que inicio de documento:

// @run-at document-start

Como el DOM probablemente aún no está cargado, espere a que el documento obtenga un readyState de interactivo:

document.onreadystatechange = function () { if (document.readyState === "interactive") { // Do something } }

Aunque Greasemonkey implementa más o menos lo mismo con fin de documento, me he dado cuenta de que la técnica anterior funciona más rápido. El uso de esto ha resuelto todos los problemas que tenía en Firefox con pantallas intermitentes / saltables en las páginas cuando los cambios DOM aparecían y cargaba la página directamente con el usuario.


Utilizando el documento @run-at document-start como se sugirió en la respuesta de @kwah, mi script se ejecutó antes de que el contenido que quería manipular estuviera en el cuerpo del documento. Como solución alternativa, configuré un intervalo de ejecución de mi script 5 veces / segundo hasta que document.readyState == "complete" (o hasta que hayan pasado 20 segundos).

Esto funcionó bien para mi caso:

// ==UserScript== // ... // @run-at document-start // ==/UserScript== var greasemonkeyInterval = setInterval(greasemonkey, 200); var greasemonkeyStart = (new Date()).getTime(); function greasemonkey() { // ... // waiting for readyState (or timeout) if ( (new Date()).getTime() - greasemonkeyStart > 20000 || document.readyState == "complete" ) { clearInterval(greasemonkeyInterval); } };

Si está más seguro de que el contenido estará allí en el documento, creo que algo así sería más preferible:

function greasemonkey() { if ( document.readyState != "interactive" && document.readyState != "complete" ) { return; } // ... clearInterval(greasemonkeyInterval); }


EDITAR: Esta publicación se creó antes de la implementación de la clave @run-at en Greasemonkey, como observó Blaise, de Greasemonkey 0.9.8, ahora puede ejecutar la secuencia de comandos tan pronto como la página comience a cargarse.

@run-at document-start se describe en el wiki de la siguiente manera:

El inicio es nuevo a partir de la versión 0.9.8. El script se ejecutará antes de que cualquier documento comience a cargarse, por lo tanto, antes de que se ejecuten los scripts o se carguen las imágenes.

Tenga en cuenta que esto significa ejecutar el script (potencialmente) antes de la creación del DOM y puede dar lugar a un comportamiento inconsistente / inusual. Necesitará (un poco) más que solo este drop-in de una sola línea.

Hay algunos detalles más en la Wiki Greasemonkey: http://wiki.greasespot.net/Metadata_Block#.40run-at

Nota al margen: la información que tengo a mano está relacionada específicamente con Greasemonkey en el navegador. No estoy seguro de si @run-at document-start funciona bien con el compilador de scripts. Sugiero vivir peligrosamente. ¡Pruébelo y descubra! ;]

Actualmente no es posible ejecutar un script de usuario antes de que se cargue la página.

Para detener el parpadeo utilizando las versiones actuales de Greasemonkey, puedes intentar agregar un estilo de usuario a tu perfil de Firefox (que luego se deshace usando el script) como se describe en la wiki de Greasemonkey, pero esto también requeriría que cada uno de tus usuarios haga lo mismo para beneficiarse de esto

Es algo que se ha deseado durante mucho tiempo y al revisar el número 1103 en el sitio Github de Greasemonkey, parece que se ha creado un prototipo (pero no hay una escala de tiempo para agregarlo a una versión de lanzamiento de afaik).