Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать задержку? 
:(
    Опции темы
Wowa
Дата 1.5.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Есть два варианта:

Код

function hierGehtsLos()
{
  window.setTimeout("hierGehtsWeiter()", 3000);
}

function hierGehtsWeiter()
{
  // Через 3 секунды будет вызвано
  window.alert("Видешь?");
}


Код

function delay(prmSec)
{
 prmSec *= 1000;
 
 var eDate = null;
 var eMsec = 0;
 
 var sDate = new Date();
 var sMsec = sDate.getTime();
 
 do {
 eDate = new Date();
 eMsec = eDate.getTime();
 
 } while ((eMsec-sMsec)<prmSec);




function init()
{
 // Start Pause with 10 seconds.
 delay(10);
 self.alert("Ready after 10 seconds");
}


PM WWW   Вверх
Zeroglif
Дата 1.5.2007, 12:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Псевдо-задержку делает второй вариант, где js-интерпретатор принудительно загружен работой и не идёт дальше (может и пойти в отдельных трудноуловимых случаях), пока её не выполнит. В этом мало красоты ибо скрипт сильно грузит машину, есть риск не вывалиться из цикла и т.п.

Первый вариант по сути задержкой (sleep) не является, т.к. таймауты в javascript - это отложенное исполнение от точки вызова (ноль) на некое количество миллисекунд. То есть определённая отдельная часть кода откладывается на потом, но интерпретатор продолжает двигаться дальше и может увеличить отложенное время. В принципе, можно представить это дело и задержкой, если отложенная часть кода и есть весь оставшийся код.

Есть ещё варианты с диалоговыми окнами, которые держат скрипт, но это не всегда работает и не особо радует пользователя.
PM MAIL WWW   Вверх
Royan
Дата 31.7.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 1
Всего: 15



Я не знаю по каким причинам здесь не приведен самый правильный вариант задержки, а именно через window.setInterval()

Важно понимать разницу между setTimeout и setInterval В первом случае для обеспечения повторения через заданный промежуток времени, вам необходимо организовать рекурсию или косвенную рекурсию. То есть, например, разместить строку window.setTimeout("hierGehtsWeiter()", 3000); в методе hierGehtsWeiter() В случае же setInterval, никакой рекурсии не нужно. Более того вызов этой функции может происходить из любого места. Собственно вызов приведет к тому что, заданная в первом параметре функция или метод будут вызываться через, заданное во втором параметре количество миллисекунд. Единственным неприятным моментом в использовании window.setInterval() является необходимость хранить значение интегрального идентификатора интервала, который используется для остановки работы этой функции. Этот интервал возвращается методом window.setInterval() и используется в методе window.clearInterval()

Для пущей ясности привожу пример:
Код

var oInterval;

function fnStartInterval(){
   oInterval = window.setInterval("fnRecycle()",1000);
}


function fnRecycle(){
   // Код, выполняющийся каждую секунду 
}

function fnStopInterval(){
   window.clearInterval(oInterval);
}




--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Zeroglif
Дата 31.7.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Royan @  31.7.2007,  10:36 Найти цитируемый пост)
Я не знаю по каким причинам здесь не приведен самый правильный вариант задержки, а именно через window.setInterval()

это не задержка (sleep), а отложенное исполнение от точки вызова (ноль), что никак не может удерживать интерпретатор;
setInterval по сравнению с setTimeout не является более правильным, один для разового исполнения, другой - нет;
- для обеспечения повторений через setTimeout можно обойтись и без рекурсии, но в любом случае для повторений setInterval удобнее;
- хранить id таймаутов для последующей "очистки" желательно и в отношении setTimeout-ов во избежание багов;
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.