JavaScript setTimeout не работает

Я хотел, чтобы функция JavaScript запускалась через 60 секунд после загрузки страницы. После небольшого исследования, которое я провел, я обнаружил, что setTimeout () - это решение.

Вот что я сделал:

<body onLoad="setTimeout(postAction('news.reads', 'article'), 60000);">

Как-то не работает setTimeout. После загрузки страницы нет необходимости ждать 60 секунд, потому что postAction () запускается немедленно.

Почему это происходит? Как это решить? Есть ли там альтернативы setTimeout ()? Спасибо!


person Ido    schedule 06.11.2012    source источник
comment
Хм, пожалуйста, несколько примеров кода ...   -  person Martin    schedule 07.11.2012
comment
Это может быть что угодно: вы передаете postAction или postAction() в качестве первого аргумента setTimout? второй - неверный. Вы передаете строку в качестве первого аргумента? Не надо. TimeOut указывается в миллисекундах, а не в секундах: 60 секунд, таким образом, записывается как 60000.   -  person Elias Van Ootegem    schedule 07.11.2012
comment
Извините, я разместил свой код ранее, но забыл пометить его как код, поэтому он был удален ... Теперь я снова добавил образец кода.   -  person Ido    schedule 07.11.2012
comment
Вы не вызываете функцию через 60 секунд с помощью вашего фрагмента, вы вызываете возвращаемое значение функции: postAction(argument, argument) - это вызов функции, все, что она возвращает, это то, что setTimeout попытается выполнить через 60 секунд. Скорее всего, это будет undefined   -  person Elias Van Ootegem    schedule 07.11.2012


Ответы (4)


Правильный способ сделать то, что вы хотите в JS, т.е. установить тайм-аут после загрузки страницы:

(function(w)
{
    var load = function()
    {
         setTimeout(postAction,60000);
         if (w.removeEventListener)
         {//remove listeners, to avoid leak...
             return w.removeEventListener('load',load,false);
         }
         return w.attachEvent('onload',load);
    };
    if (w.addEventListener)
    {
        return w.addEventListener('load',load,false);
    }
    return w.attachEvent('onload',load);
}(this));

Вместо window.onload = function(){setTimeout(postAction,60000);};, что тоже будет работать, но вызовет утечку памяти в IE ‹9. Это просто для полноты картины
В любом случае, ключевая строка здесь setTimeout(postAction,60000);

Обновить
После просмотра кода, который вы используете, это самое простое исправление:

<body onLoad="setTimeout(function(){ return postAction('news.reads', 'article');}, 60000);">
person Elias Van Ootegem    schedule 06.11.2012
comment
@IdoDoron: Рад помочь, удачного кодирования - person Elias Van Ootegem; 07.11.2012

Вам нужно обернуть postAction в функцию, чтобы отложить выполнение:

setTimeout(function() { postAction('news.reads', 'article'); }, 60000);

Фактически вы немедленно выполняете postAction, ваш код эквивалентен:

var result = postAction('news.reads', 'article');

setTimeout(result, 60000);
person Mike Valenty    schedule 06.11.2012
comment
большой! работал у меня, +1 - person F481; 09.07.2013
comment
Чисто и уместно .. Спасибо :) - person shivi; 25.03.2015
comment
спасибо, у меня тоже сработало +1 - person papo; 05.05.2020

Вы используете setTimeout как:

setTimeout(function(){alert("OK");}, 1000 * 60); // alert "OK" in 60s
person ChristopheCVB    schedule 06.11.2012

person    schedule
comment
НЕЕЕТ setInterval без присвоения идентификатора интервала ... это просто неправильно! это создает бесконечный цикл! Продолжайте @Martin, смею вас вставить этот код в вашу консоль :) - person Elias Van Ootegem; 07.11.2012
comment
Да, но не слишком далеко, чтобы предотвратить это. - person Martin; 07.11.2012
comment
Извините, но это получает -1: первое предложение вызвало бесконечный цикл, и ваше предлагаемое решение устанавливает глобальную переменную - просто используйте setTimeout, для чего это нужно - person Elias Van Ootegem; 07.11.2012
comment
Хорошо, мне пора спать, наверное :( - person Martin; 07.11.2012