Запустить и остановить обновление JavaScript - PullRequest
3 голосов
/ 22 декабря 2009

У меня есть страница, которую нужно обновлять каждые 60 секунд. На этой странице я использую iBox для отображения различных элементов. Моя проблема в том, что мета-обновление убивает всплывающее окно, которое не требуется. Пожалуйста, имейте в виду, что у меня практически нет опыта работы с javascript, поэтому моё решение может быть в корне неверным.

Решение, которое я придумал, заключается в использовании javascript для обновления. Когда страница загружается, я запускаю таймер, когда всплывает ibox, я очищаю таймер, когда ibox закрывается, я снова запускаю таймер.

Я настраиваю это с помощью простой функции.

function timedRefresh(timeoutPeriod){
    var resetId = 0;
    resetId=setTimeout("location.reload(true);",timeoutPeriod);
}

Тогда я вызываю функцию <body onload="timedRefresh(60000)">.

Моя проблема возникает из-за того, что я пытаюсь позвонить clearTimeout(resetID). Я пытаюсь вызвать метод из функции скрытия скрипта ibox, но на самом деле он не очищает таймер. Я думаю, что это может быть проблема с областью действия, и мне, возможно, потребуется сделать что-то вроде Object.clearTimeout(Object.resetID), но это всего лишь предположение.

Ответы [ 4 ]

1 голос
/ 22 декабря 2009

Сделайте это:

function timedRefresh(timeoutPeriod){
    window.resetId = 0; // make it clear it's global by prefixing "window."
    window.resetId=setTimeout("location.reload(true);",timeoutPeriod);
}

Затем из соответствующей функции ibox используйте window.resetId.


Увидев твой комментарий, я кое-что добавлю.

"window." будет работать при создании сценариев в браузере, если вы используете JS где-то еще, это, вероятно, не будет работать.

Однако, пока вы находитесь на веб-странице, окно является глобальным объектом, а префикс "окно". - это IMO, хороший способ прояснить, что определенные переменные являются глобальными; если вы используете его последовательно, все переменные, которые не имеют «окна». перед ними всегда местные.

Однако вы должны знать, что это также будет работать, если вы просто используете resetId без префикса и без var , потому что любая переменная, которая не объявлена ​​с var автоматически ограничено окном .

Это краткое руководство научит вас большей части того, что вам нужно знать о переменной видимости в Javascript, контекстах выполнения и замыканиях. Он отправит вас в путь, чтобы стать смертельным ниндзя Javascript.

0 голосов
/ 22 декабря 2009

Вы правы, проблема в области действия переменной resetId. Когда вы объявляете это в функции с ключевым словом var, она является локальной для этой функции и, следовательно, не существует вне ее.

Просто объявите resetId вне функции, чтобы сделать ее глобальной, и все будет в порядке:

var resetId = 0;
function timedRefresh(timeoutPeriod){
    resetId=setTimeout("location.reload(true);",timeoutPeriod);
}
0 голосов
/ 22 декабря 2009

Я бы предложил сделать контент на странице, который необходимо обновить, обновить через ajax. Вот ссылка на учебник http://www.w3schools.com/Ajax/Default.Asp

0 голосов
/ 22 декабря 2009

Самый простой способ - добавить переменную resetId в глобальную область:

var resetId = 0;
function timedRefresh(timeoutPeriod){
    resetId=setTimeout("location.reload(true);",timeoutPeriod);
}

Кроме того, вы можете определить функцию скрытия iBox в той же области видимости, но я не слишком уверен, как работает iBox.

Больше чтения по областям: http://javascript.about.com/library/bltut07.htm

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