这是我的脚本代码:
// ==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将函数解决到像this这样的页面上来解决它。还有另一种方式吗?
感谢。
答案 0 :(得分: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);
答案 1 :(得分:2)
iirc,greasemonkey在它自己的范围内运行,因此test不会在全局命名空间中。
为什么不通过DOM操作创建你的锚元素,而不是对全局进行策略?这将返回一个引用,您可以绑定匿名函数(或greasemonkey范围测试)。
答案 2 :(得分:1)
尝试将功能测试添加到窗口对象
window.test = function ...
修改强>
此外,最好从“加载”事件处理程序运行代码,而不是仅在脚本结束时调用它。 e.g:
window.addEventListener("load", function(e) {
// Your main() here
}, false);