Javascript синхронизированный цикл с / setTimeout не работает - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь написать скрипт для обновления iframe каждую секунду. Это то, что я имею до сих пор, и по какой-то причине он загружается некоторое время, а затем отображает число 14541 +/- 50 или около того. Слова «что-то» и «что-то еще» также никогда не появляются на экране.

Это останавливается на 14541 из-за какой-то встроенной защиты браузера от бесконечных циклов или чего-то еще? Почему таймер работает неправильно?

var c = 0;
var t;
timer();
document.write("something");
function timer(){
    if(t) { window.clearTimeout(t) }
    update_preview();
    c++;
    t=setTimeout(timer(), 1000);
    document.write("something else");
}
function update_preview(){
    prev = window.open("","preview");
    prev.document.open();
    prev.document.writeln("<html><head><title>live preview window</title></head><body>");
    prev.document.writeln(c);
    prev.document.writeln("</body></html>");
    prev.document.close();
}

Ответы [ 6 ]

1 голос
/ 24 февраля 2012

Используйте это,

t=setTimeout(function(){timer();}, 1000);

или

t=setTimeout(timer, 1000);

или

t=setTimeout("timer()", 1000);

Последний вариант не следует использовать.

0 голосов
/ 25 февраля 2012

Было бы лучше использовать setInterval вместо setTimeout.

0 голосов
/ 24 февраля 2012

Причина, по которой «что-то еще» не отображается, заключается в том, что когда вы вызываете setTimeout и передаете функцию, функция timer обрабатывается немедленно.То же самое происходит внутри функции.Итак, вы создаете бесконечный бесконечный рекурсивный цикл, который сделает ваш браузер не отвечающим.

Поскольку вы запускаете setTimeout на timer каждый раз, когда запускаете функцию timer, которая1 секунда, вместо использования setTimeout, вы должны использовать setInterval.

Так ваш код будет выглядеть так:

var c = 0;
var t;
timer();

// call setInterval here to run the timer function every 1 second
t=setInterval('timer()', 1000);

document.write("something");
function timer(){
    if(t) { window.clearTimeout(t) }
    update_preview();
    c++;
    document.write("something else");
}
function update_preview(){
    prev = window.open("","preview");
    prev.document.open();
    prev.document.writeln("<html><head><title>live preview window</title></head><body>");
    prev.document.writeln(c);
    prev.document.writeln("</body></html>");
    prev.document.close();
}

Так что теперь вместо запуска setTimeout каждую 1 секундувы запускаете setInterval один раз, и он будет обрабатываться каждую 1 секунду.

0 голосов
/ 24 февраля 2012

Вы не можете вызвать метод timer как параметр функции timer.Вы должны передать в качестве параметра функцию timer:

setTimeout (timer, 1000);

Не использовать document.write устарел.Посмотрите на DOM и jQuery, чтобы динамически манипулировать страницей.

0 голосов
/ 24 февраля 2012

В этой строке t=setTimeout(timer(), 1000); вы не передаете timer в setTimout, вы передаете результат timer.Вы должны использовать t=setTimeout(timer, 1000); вместо.

0 голосов
/ 24 февраля 2012

Удалить () после timer.

Помещая timer(), вы немедленно вызываете функцию timer и присваиваете возвращаемое значение (undefined, поскольку в этой функции ничего не return), функция выполняется, когда заканчивается таймер.

Вместо этого вы должны просто поставить timer. При этом сама функция, а не ее возвращаемое значение, передается в функцию, вызываемую по истечении времени таймера.

Также, для ясности, я бы предложил поставить function timer() {...} бит перед начальным вызовом timer(). JavaScript делает это для вас автоматически (это называется «подъём»), но это легче понять, если вы сначала сами определите определение функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...