从Greasemonkey访问variables到页面(反之亦然)

我在</ body>之前运行的test.js中有以下代码:

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

我在test.user.js中有以下代码:

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

“炉灶”得到提醒,所以我知道页面JavaScript的作品, document.title获取更改,所以我知道脚本JavaScript的作品。 但是,在网页上我得到的错误:

错误:ReferenceError:油腻未定义源文件:/test.js

如何从网页访问由Greasemonkey设置的variables,反之亦然?

  • Greasemonkey脚本在单独的作用域中运行,也可以在沙箱中运行,具体取决于@grant设置 。

  • 另外,问题代码在一个函数范围内隔离greasy (如gladoscc所说)。

  • 最后,默认情况下, test.js会在Greasemonkey脚本执行之前触发,所以它不会看到任何设置variables。 使用@run-at document-start来解决这个问题。

所以,考虑到这个test.js ,请在</body>之前运行:

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

然后下面的工作:

没有沙箱:

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

用沙箱,没有函数作用域, unsafeWindow
==> 重要更新: Greasemonkey更改2.0版的unsafeWindow处理,下一个示例脚本将不适用于GM 2.0或更高版本 。 另外两个解决scheme仍然有效。

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

用沙箱,没有function范围, 脚本注入

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

笔记:

  1. 您可以在此页面上testing这些脚本(jsbin.com/esikut) 。
  2. 没有沙箱, unsafeWindow windowwindow是相同的。
  3. 所有这些脚本在控制台上产生相同的输出:

     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. 脚本注入代码可以在Firefox以外的各种浏览器中使用。 unsafeWindow目前只适用于Firefox + Greasemonkey(或Scriptish)或Chrome + Tampermonkey。

你的variablesgreasy是在匿名函数的范围内定义的。 即使在用户脚本中也不能访问greasy ,除非它是你的函数的一部分。 例:

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

这样做:

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

另外,为什么你把所有的代码放在一个匿名函数中,然后执行它?