Обратный отсчет от GreaseMonkey не работает? - PullRequest
2 голосов
/ 28 июня 2010

Я очень запутался, поскольку greasemonkey setTimeout просто не работает, он никогда не вызывает эту функцию, и, глядя в онлайн, люди говорят, что greasemonkey не поддерживает setTimeout, есть ли способ заставить мою цель (ниже) работать?

function countdown(time, id) {
   if(document.getElementById(id)) {
       var name = document.getElementById(id);
       var hrs = Math.floor(time / 3600); 
       var minutes = Math.floor((time - (hrs * 3600)) / 60); 
       var seconds = Math.floor(time - (hrs * 3600) - minutes * 60);

       if(hrs>0) {
            name.innerhtml = hrs + 'h ' + minutes + 'm';
       } else if(minutes>0) {
            name.innerhtml = minutes + 'm ' + seconds + 's';
       } else {
            name.innerhtml = seconds + 's';
       }
   } else {
       setTimeout('countdown(' + --time + ',' + id + ')', 100);
   }

   if(time <= 0)
      window.location.reload();
   else
      setTimeout('countdown(' + --time + ',' + id + ')', 1000);
} 

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Проблема заключается в текстовом параметре setTimeout.Это работает очень хорошо с greasemonkey, но если вы используете текстовые команды вместо обратных вызовов, код никогда не выполняется, так как песочница greasemonkey очищается к моменту запуска setTimeout.Он пытается запустить eval с текстовым параметром, который в свою очередь wchis пытается вызвать функцию countdown, которая к тому времени больше не существует.

В настоящее время поток программы выглядит следующим образом:

1. function countdown(){}

2. setTimeout("countdown()", 1000);

3. clearGreasemonkeySandbox();

4. ... wait 1 sec...

5. eval("countdown()"); // <- countdown doesn't exist anymore

Таким образом, вы должны использовать обратные вызовы, поэтому вместо полного предложения используется указатель на функцию.

setTimeout(function(){
    countdown(--time, id);
}, 1000);
1 голос
/ 28 июня 2010

В итоге я использовал

window.setTimeout(bla, 1000);

и

window.bla = function() { alert("cool"); }

...