7

这是我的脚本代码:

    // ==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 到页面上来解决。还有其他方法吗?

谢谢。

4

3 回答 3

14

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);
于 2009-02-15T17:17:10.867 回答
2

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

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

于 2009-02-15T15:33:18.450 回答
1

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

window.test = function ...

编辑

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

window.addEventListener("load", function(e) {
 // Your main() here
}, false);
于 2009-02-15T15:24:24.867 回答