如果您使用GreaseMonkey,則您定義的任何函數都由GM對沙箱進行沙箱處理,並且在主窗口中不可用。
但是,當您使用任何本機功能時,如setTimeout或警報,它們在主窗口的上下文中調用,例如: 當你調用的setTimeout你實際上是在呼籲window.setTimeout()
現在你已經定義的函數,馬克不會在主窗口存在,你問的setTimeout做的是評估字符串「標誌()」。當超時觸發 window.eval('mark()')
被調用並且如所討論的,window.mark未定義。所以你有幾個選擇:
1)在窗口對象上定義標記。GM可以讓你通過unsafeWindow對象這樣做:
unsafeWindow.mark = function(){}
setTimeout('mark()', 10); //this works but is ugly, it uses eval
2)傳遞給的setTimeout到當地馬克參考:
function mark(){}
setTimeout(mark, 10); //this works too but you can't send parameters
但是,如果你需要什麼發送參數? 如果您在主窗口中定義的函數,eval方法就可以了(但它是醜陋的 - 不這樣做)
unsafeWindow.mark2 = function(param) {
alert(param)
}
setTimeout('mark2("hello")', 10); //this alerts hello
但這種方法與參數的函數工作是否已經定義了它們GM 主窗口或只是在呼叫被包裹在一個匿名函數並傳遞到的setTimeout
setTimeout(function() {
mark2("hello")
}, 10); //this alerts hello
是另一個函數中定義的函數,通過任何機會呢? – 2011-05-07 07:51:46
你使用的是什麼環境?工作正常 - http://jsfiddle.net/russcam/6EXa9/ – 2011-05-07 07:52:28
這不工作...對我來說..我不明白爲什麼? 該函數不在任何函數內,其全局! – 2011-05-07 08:07:39