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:
- Puede probar estas secuencias de comandos en esta página (jsbin.com/esikut) .
- Sin sandbox,
unsafeWindow
ywindow
unsafeWindow
son las mismas. 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
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.