栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

设置@grant值时,如何访问“窗口”(目标页面)对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设置@grant值时,如何访问“窗口”(目标页面)对象?

当您设置任何

@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脚本能够读取和更改页面的变量和功能。


笔记:

  1. 这是所有 特定于Firefox的
  2. 对于跨平台代码和某些复杂情况,可以改用脚本注入 。但是注入的代码不能直接访问
    GM_
    函数。
  3. 请注意,这些技术仅适用于全局的javascript变量和函数。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635076.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号