scripts script monkey grease chrome javascript firefox firefox-addon greasemonkey

javascript - chrome - script greasemonkey



Accediendo a las variables de Greasemonkey a la página y viceversa (2)

Su variable greasy se define en el alcance de la función anónima. No puede acceder a greasy incluso en su usuario, a menos que sea parte de su función. Ejemplo:

(function(){ var foo = 5; alert(foo); }(); alert(foo); //ERROR, because foo is undefined outside of the function.

Hacerlo de esta forma:

var foo = 5; (function(){ alert(foo); }(); alert(foo);

Además, ¿por qué pones todo tu código en una función anónima y luego lo ejecutas?

Tengo el siguiente código en test.js que se ejecuta justo antes de </ body>:

alert(''stovetop''); alert(greasy);

Tengo el siguiente código en test.user.js :

(function () { ''use strict''; var greasy = ''greasy variable''; document.title = ''greasy title''; }());

''stovetop'' recibe una alerta, así que sé que la página de JavaScript funciona, y document.title obtiene cambios, así que sé que el script de JavaScript funciona. Sin embargo, en la página web recibo el error:

Error: ReferenceError: grasiento no está definido Archivo de origen: /test.js

¿Cómo accedo desde la página web a la variable establecida por Greasemonkey y qué tal viceversa?


  • Los scripts de Greasemonkey operan en un ámbito separado y también pueden operar en un entorno limitado, según la configuración de @grant .

  • Además, el código de pregunta aísla greasy en un ámbito de función (como dijo gladoscc).

  • Finalmente, de manera predeterminada, test.js se activará antes de que el script Greasemonkey lo haga, por lo que no verá ninguna variable establecida, de todos modos. Utilice @run-at document-start para abordar eso.


Entonces, dado este test.js , ejecute justo antes de </body> :

window.targetPages_GlobalVar = ''stovetop''; console.log ("On target page, local global: ", targetPages_GlobalVar); console.log ("On target page, script global: ", gmScripts_GlobalVar);

Entonces, lo siguiente funcionará:

Sin caja de arena:

// ==UserScript== // @name _Greasemonkey and target page, variable interaction // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @include http://jsbin.com/esikut/* // @run-at document-start // @grant none // ==/UserScript== //--- For @grant none, could also use window. instead of unsafeWindow. unsafeWindow.gmScripts_GlobalVar = ''greasy''; console.log ("In GM script, local global: ", unsafeWindow.targetPages_GlobalVar); console.log ("In GM script, script global: ", gmScripts_GlobalVar); window.addEventListener ("DOMContentLoaded", function() { console.log ("In GM script, local global, after ready: ", unsafeWindow.targetPages_GlobalVar); }, false);


Con sandbox, sin alcance de función, unsafeWindow :
==> Actualización importante: Greasemonkey cambió el manejo inseguro de Windows con la versión 2.0, el próximo script de ejemplo no funcionará con GM 2.0 o posterior . Las otras dos soluciones aún funcionan.

// ==UserScript== // @name _Greasemonkey and target page, variable interaction // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @include http://jsbin.com/esikut/* // @run-at document-start // @grant GM_addStyle // ==/UserScript== /*- The @grant directive is needed to work around a design change introduced in GM 1.0. It restores the sandbox. */ unsafeWindow.gmScripts_GlobalVar = ''greasy''; console.log ("In GM script, local global: ", unsafeWindow.targetPages_GlobalVar); console.log ("In GM script, script global: ", unsafeWindow.gmScripts_GlobalVar); window.addEventListener ("DOMContentLoaded", function() { console.log ("In GM script, local global, after ready: ", unsafeWindow.targetPages_GlobalVar); }, false);


Con sandbox, sin alcance de función, Inyección de scripts :

// ==UserScript== // @name _Greasemonkey and target page, variable interaction // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @include http://jsbin.com/esikut/* // @run-at document-start // @grant GM_addStyle // ==/UserScript== /*- The @grant directive is needed to work around a design change introduced in GM 1.0. It restores the sandbox. */ function GM_main () { window.gmScripts_GlobalVar = ''greasy''; console.log ("In GM script, local global: ", window.targetPages_GlobalVar); console.log ("In GM script, script global: ", window.gmScripts_GlobalVar); window.addEventListener ("DOMContentLoaded", function() { console.log ("In GM script, local global, after ready: ", window.targetPages_GlobalVar); }, false); } addJS_Node (null, null, GM_main); function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement (''script''); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = ''('' + funcToRun.toString() + '')()''; var targ = D.getElementsByTagName (''head'')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); }

Notas:

  1. Puede probar estas secuencias de comandos en esta página (jsbin.com/esikut) .
  2. Sin sandbox, unsafeWindow y window unsafeWindow son las mismas.
  3. Todos estos scripts producen el mismo resultado en la consola:

    In GM script, local global: undefined In GM script, script global: greasy On target page, local global: stovetop On target page, script global: greasy In GM script, local global, after ready: stovetop

  4. El código de inyección de scripts funcionará en una variedad de navegadores además de Firefox. unsafeWindow actualmente solo funciona en Firefox + Greasemonkey (o Scriptish) o Chrome + Tampermonkey.