当您设置任何
@grant其他值时,Greasemonkey会激活其沙箱,而Greasemonkey2.0将彻底改变unsafeWindow处理。
现在,为了在目标页面范围内创建或覆盖变量,您必须从技术菜单中正确选择。例如:
To Read:
一个简单的变量:
Target page sets: var foo = "bar";
GM script can read: unsafeWindow.foo //– “bar”
一个简单的对象:
Target page sets: var obj = {A: 1};GM script can read: unsafeWindow.obj //– Object { A: 1 }
一个复杂的对象: 这并不总是可能的。
To Call:
- 一个简单的功能:
Target page sets: function func () {console.log ('Hi');}GM script can call: unsafeWindow.func() //– “Hi”
To Write/Set:
一个简单的变量:
unsafeWindow.foo = "Apple";
一个简单的对象:
var gmObject = {X: "123"};unsafeWindow.obj = cloneInto (gmObject, unsafeWindow);
一个简单的功能:
function gmFunc () {console.log ("Lorem ipsum");//-- Can use GM_ functions in here! :)}
unsafeWindow.func = exportFunction (gmFunc, unsafeWindow);
考虑以下HTML:
<button id="helloBtn">Say "Hello".</button>
而这个Javascript:
var simpleGlobalVar = "A simple, global var in the page scope.";var globalObject = {Letter: "A", Number: 2};function simpleFunction () { console.log ("The target page's simpleFunction was called.");}var sayHello = function() { console.log ('Hello.');}document.getElementById ('helloBtn').addEventListener ('click', function () { sayHello ();} );如果在该页面上安装并运行此Greasemonkey脚本:
// ==Userscript==// @name _Demonstrate accessing target-page variables with @grant values set// @include http://fiddle.jshell.net/sepwL7n6/*/show/// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js// @grant GM_addStyle// ==/Userscript==console.log ("*** Greasemonkey script start.");$("body").append ('<div id="gmArea">Added by Greasemonkey:<p></p></div>');$("#gmArea > p:first").append ('<button id="gmShow">Access select target-page variables and functions</button>');$("#gmArea > p:first").append ('<button id="gmChange">Change javascript things in the target-page scope.</button>');$("#gmShow").click ( function () { //-- Access things from the target-page scope: console.log ("----------------"); console.log ("==> simpleGlobalVar is: ", unsafeWindow.simpleGlobalVar); console.log ("==> globalObject is: ", unsafeWindow.globalObject); console.log ("==> Calling target's simpleFunction():"); unsafeWindow.simpleFunction (); //-- WARNING! This next technique is not robust, but works in some cases. console.log ("==> Calling target's button's click()."); unsafeWindow.document.getElementById ('helloBtn').click ();} );$("#gmChange").click ( function () { this.disabled = true; //-- Can only click once. unsafeWindow.simpleGlobalVar = "Simple var... Intercepted by GM!"; unsafeWindow.globalObject = cloneInto (gmObject, unsafeWindow); unsafeWindow.sayHello= exportFunction (sayHello, unsafeWindow); console.log ("==> Target page objects were changed.");} );var gmMessageStr = "Function... Intercepted by GM, but also can use GM_ functions!";function sayHello () { sayHello.K = (sayHello.K || 0) + 1; console.log (gmMessageStr); GM_addStyle ('body {background: ' + (sayHello.K % 2 ? "lime" : "white") + ';}');}var gmObject = {message: "Object overridden by GM."};打开控制台并按下按钮,您将看到GM脚本能够读取和更改页面的变量和功能。
笔记:
- 这是所有 特定于Firefox的 。
- 对于跨平台代码和某些复杂情况,可以改用脚本注入 。但是注入的代码不能直接访问
GM_
函数。 - 请注意,这些技术仅适用于全局的javascript变量和函数。



