Если вы используете GreaseMonkey, любые определяемые вами функции помещаются в песочницу GM и недоступны в главном окне.
Однако при использовании любой из встроенных функций, таких как setTimeout или alert , они вызываются в контексте основного окна, например;
когда вы звоните setTimeout , вы на самом деле звоните window.setTimeout()
Теперь функция, которую вы определили, mark не существует в главном окне, и то, что вы просите setTimeout , - это оценить строку 'mark ()'. Когда тайм-аут срабатывает
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