【问题标题】:Greasemonkey Script and Function ScopeGreasemonkey 脚本和函数作用域
【发布时间】:2009-02-15 15:20:57
【问题描述】:

这是我的脚本代码:

    // ==UserScript==
    // @name          test 
    // @description   test
    // @include       http://*
    // @copyright     Bruno Tyndall
    // ==/UserScript==

    var main = function() {
        var b = document.getElementsByTagName('body')[0];
        var t = document.createElement('div');
        t.innerHTML = '<a href="javascript:void(0);" style="color:white;">Hello World</a>';
        t.style.position = 'absolute';
        t.style.zIndex = 1000;
        t.style.bottom = '5px';
        t.style.right = '5px';
        t.firstChild.setAttribute('onclick', 'test();');
        b.appendChild(t);

    }

    var test = function() {
        alert("Hello World");
    }
    main();

我唯一的问题是当点击 Hello World 时页面找不到 test() 函数。请告诉我,我不必通过innerHTML'ing 函数到this 之类的页面上来解决它。还有其他方法吗?

谢谢。

【问题讨论】:

    标签: javascript firefox scope greasemonkey


    【解决方案1】:

    Greasemonkey 在沙箱中执行脚本 - 出于安全原因,页面无权访问它。对 dom 和 window 的所有访问都是通过包装器。

    如果你想访问不安全的对象,你可以使用wrappedJSObject 属性。

    对于您的情况,您可以使用unsafeWindow(或window.wrappedJSObject):

    unsafeWindow.test = function() { ....
    

    这存在一些安全问题,请参阅:http://wiki.greasespot.net/UnsafeWindow

    另外,greasemonkey 在 DOMContentLoaded(当 dom 准备好时)事件之后执行脚本,所以你不需要那些 onload 废话。

    此外,您不能使用属性来设置事件侦听器或属性 - 您必须为此使用 dom api。例如:

    t.firstChild.addEventListener('click', test, false);
    

    或:

    t.firstChild.addEventListener('click', function(event){ blabla }, false);
    

    【讨论】:

    • +1。谢谢。我会很感激你对我现在被困在哪里的想法。我在userscripts.org/topics/21770 上发布了它,我也无法让内联匿名函数工作。
    • 我应该补充...我从错误控制台得到零帮助,就出了什么问题。
    • 如果有人错过了我使用的是 onclick 而不是 click。
    【解决方案2】:

    iirc,greasemonkey 在它自己的范围内运行,所以 test 不会在全局命名空间中。

    与其污染全局,为什么不通过 DOM 操作来创建你的锚元素呢?这将返回一个引用,您可以绑定一个匿名函数(或greasemonkey 范围测试)。

    【讨论】:

    • 你能详细说明一下吗?如果你想保持函数“非匿名”(在 Greasemonkey 范围内),你会怎么做。绑定是什么意思?
    • 我现在正在通过 DOM 操作创建锚点。但我看不到如何正确“绑定”函数。
    • 我已经回答了这个问题,然后看到你已经到了:)
    【解决方案3】:

    尝试将功能测试添加到窗口对象

    window.test = function ...
    

    编辑

    此外,最好从“加载”事件处理程序运行代码,而不是仅在脚本末尾调用它。例如:

    window.addEventListener("load", function(e) {
     // Your main() here
    }, false);
    

    【讨论】:

    • window.test = function ... 对我不起作用。仍然给了我未定义的测试错误。
    • 你在 main 中调用 window.test() 吗?
    • @AssafLavie 我陷入了一个类似(但不完全相同)的问题here。想看看吗?还是谢谢。
    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多