Задержка Greasemonkey ... setTimeout не работает нормально - PullRequest
1 голос
/ 24 мая 2011

Я играю с сайтом, на котором я хочу продолжать нажимать кнопку i количество раз каждые interval секунды.

Мой код:

clickbidBtn1 = function() {
    var bidBtn=document.getElementById("BidButton");

    var interval = 15000;
    for (var i=3; i>=0; i--){
    setTimeout(bidBtn.click(1);,i*interval);
};

Я обнаружил, что GM выполняет все i количество кликов одновременно, а не с запланированной задержкой.Есть ли способ отложить время клика?Скажем, я хотел, чтобы функция нажимала кнопку каждые 15 секунд i раз.

Я думал дать ей еще несколько переменных и добавить одну переменную в части кода settimeout, которая тольковыполняет @ щелчок, затем сравнивает увеличенные переменные с текущими, прежде чем перейти к следующему settimeout ... но пока не продумал это ... это кажется сложным процессом для простого процесса ... :(я немного поиграюсь с этим

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Используйте для этого setInterval().

В одну сторону:

var bidClickTimer       = 0;
var numBidClicks        = 0;

function clickbidBtn1 ()
{
    var interval        = 15000;
    bidClickTimer       = setInterval (function() {BidClick (); }, interval);
}

function BidClick ()
{
    numBidClicks++;
    if (numBidClicks > 3)
    {
        clearInterval (bidClickTimer);
        bidClickTimer   = "";
    }
    else
    {
        bidBtn.click (1);
    }
}

clickbidBtn1 ();

В качестве альтернативы, без использования глобальных переменных:

function clickbidBtn1 ()
{
    var interval            = 15000;
    this.numBidClicks       = 0;
    this.bidClickTimer      = 0;
    this.BidClick           = function () {
                                numBidClicks++;
                                if (numBidClicks > 3)
                                {
                                    clearInterval (bidClickTimer);
                                    bidClickTimer   = "";
                                }
                                else
                                {
                                    bidBtn.click (1);
                                }
                            };
    this.bidClickTimer      = setInterval (function(thisScope) {thisScope.BidClick (); }, interval, this);
}

clickbidBtn1 ();
0 голосов
/ 24 мая 2011

Просто чтобы объяснить, почему ваш код не работает: вы вызываете метод .click немедленно (ставите () после имени функции, вызывающего функцию) и фактически передаете возвращаемое значение этой функции в setTimeout. Цикл for настолько быстр, что кажется, что все происходит одновременно.

Вы должны передать ссылку на функцию в setTimeout, например, анонимная функция:

setTimeout(function() {
    bidBtn.click(1);
}, i*interval);
...