代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

GreaseMonkey脚本和功能范围

  •  7
  • BuddyJoe  · 技术社区  · 15 年前

    这是我的脚本代码:

        // ==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()函数。请告诉我,我不必像这样通过在页面上内置函数来解决问题。 this . 还有别的办法吗?

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  14
  •   ionelmc    15 年前

    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);
    
        2
  •  2
  •   annakata    15 年前

    IIRC,greasemonkey在它自己的范围内运行,因此测试将不在全局命名空间中。

    为什么不通过dom操作来创建锚元素,而不是争论全局呢?这将返回一个引用,您可以绑定一个匿名函数(或GreaseMonkey范围测试)。

        3
  •  1
  •   Assaf Lavie    15 年前

    尝试将函数测试添加到窗口对象

    window.test = function ...
    

    编辑

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

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