БлогNot. Пауза на Javascript?

Пауза на Javascript?

Классического оператора pause или delay в классическом JavaScript нет. Конечно, можно попытаться его "эмулировать" с помощью обработки системного времени:

<script type="text/javascript">
 function pause (ms) {
  if (ms<=0) return;
  var now = new Date();
  now.setTime (now.getTime()+ms);
  var end=now.getTime();
  do {
   now = new Date();
  } while (now.getTime()<end);
 }

 function test () {
  var ms=parseInt(document.form_pause.ms.value);
  if (isNaN(ms) || ms<=0) {
   document.getElementById('res_pause').innerHTML = 'Введите натуральное число миллисекунд';
   return;
  }
  document.getElementById('res_pause').innerHTML = 'Начало паузы '+ms+' мс...';
  pause (ms); //Это не работает; сообщение "Начало паузы" "висеть" не будет
  document.getElementById('res_pause').innerHTML = 'Выполнено';
 }
</script>
<noscript>
 <div align="center">Извините, для работы нужен включённый Javascript</div>
</noscript>

Увы, этот, казалось бы, естественный код, к успеху не приведёт - сообщения о начале паузы мы не увидим ни в одном бразуере, хотя скрипт и "затормозит" на выбранное время, сделав, в том числе, недоступными кнопку и поле ввода:

 Выполнить неправильный пример в текущей вкладке (1 Кб)

(чтобы понять, в чём суть дела, введите число побольше, вроде 3000 или 5000, и попробуйте пощелкать в это время по элементам окна)

Дело в том, что выполнение на Javascript - однопоточное. страница блокируется полностью. Поэтому попробуем по-другому, используя возможности стандартного метода setTimeout:

<script type="text/javascript">
 var id;

 function after_function() {
  window.clearTimeout (id);
  document.getElementById('res_pause').innerHTML = 'Выполнено';
  //Здесь поместите свой код
 }

 function test () {
  var ms=parseInt(document.form_pause.ms.value);
  if (isNaN(ms) || ms<=0) {
   document.getElementById('res_pause').innerHTML = 'Введите натуральное число миллисекунд';
   return;
  }
  document.getElementById('res_pause').innerHTML = 'Начало паузы '+ms+' мс...';
  id = window.setTimeout ("after_function()",ms);
 }
</script>
<noscript>
 <div align="center">Извините, для работы нужен включённый Javascript</div>
</noscript>

<div align="center">
<form name="form_pause">
Время остановки, мс: <input type="text" name="ms" size="5" maxlength="4"> 
<input type="button" value="Ввод" onClick="test()">
</form>
</div>
<div align="center" id="res_pause"></div>

 Выполнить правильный пример паузы в Javascript в текущей вкладке (1 Кб)

Этот вариант выполнится естественней - будут выведены сообщения о начале и конце паузы, а вместо комментария в тело метода after_function можно поместить свой код.

Следует только понимать, что метод setTimeout (как и setInterval) не нарушает и не останавливает обработку скрипта, то есть, код продолжает выполняться и после оператора

id = window.setTimeout ("after_function()",ms);

- просто у нас он последний в обработчике клика и делать скрипту больше нечего.

Иными словами, мы просто откладываем будущее событие на указанное время.

28.08.2014, 15:28 [12800 просмотров]


теги: javascript время

К этой статье пока нет комментариев, Ваш будет первым