Yug*_*dle 6 javascript greasemonkey asynchronous javascript-events
这是我的代码:
function mark()
{
alert("This is a test box..");
}
setTimeout("mark()",5000);
Run Code Online (Sandbox Code Playgroud)
错误:找不到功能标记()!!
还有一些其他问题..因为它适用于http://jsfiddle.net/russcam/6EXa9/,但它不能在我的应用程序中工作..所以你能帮我调试一下吗?
还有什么原因..顺便说一句,我在GreaseMonkey脚本中运行它!
meo*_*ouw 11
如果您使用的是GreaseMonkey,则您定义的任何函数都由GM沙箱化,在主窗口中不可用.
当您使用任何本机函数时,例如setTimeout或alert,它们在主窗口的上下文中被调用,例如; 当你调用setTimeout时,你实际上正在调用window.setTimeout()
现在你定义的函数,主窗口中不存在标记,你要求setTimeout做的是评估字符串'mark()'.当window.eval( 'mark()' )调用超时触发时
,如上所述,未定义window.mark.所以你有几个选择:
1)在窗口对象上定义标记.GM允许您通过unsafeWindow对象执行此操作,如下所示:
unsafeWindow.mark = function(){}
setTimeout( 'mark()', 10 ); //this works but is ugly, it uses eval
Run Code Online (Sandbox Code Playgroud)
2)将对本地标记的引用传递给setTimeout:
function mark(){}
setTimeout( mark, 10 ); //this works too but you can't send parameters
Run Code Online (Sandbox Code Playgroud)
但是如果你需要发送参数怎么办?如果你已经在主窗口上定义了你的函数,那么eval方法将起作用(但它很丑陋 - 不要这样做)
unsafeWindow.mark2 = function( param ) {
alert( param )
}
setTimeout( 'mark2( "hello" )', 10 ); //this alerts hello
Run Code Online (Sandbox Code Playgroud)
但是这个方法适用于带参数的函数,无论你是在主窗口还是在GM中定义它们.调用都包含在一个匿名函数中并传递给setTimeout
setTimeout( function() {
mark2( "hello" )
}, 10 ); //this alerts hello
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4156 次 |
| 最近记录: |