Войти

Показать полную графическую версию : [решено] Пауза в JavaScript


Coutty
04-11-2007, 16:17
Как организовать паузу в скрипте на заданное количество миллисекунд?
Нужно повторять определённое действие (переместить объект), скажем, 20 раз в секунду. При этом в паузах желательно не тратить процессорное время.

XCodeR
04-11-2007, 17:15
поможет? (http://snippets.dzone.com/posts/show/2253)

или:
function sleep(msec) {
var k = function_continuation;
setTimeout(function() { resume k <- mesc; }, msec);
suspend;
}

Coutty
04-11-2007, 17:54
По ссылке - работает, но съедает процессор на 100%, т.ч. не подходит.

Приведённый код не работает, но идею я понял: через msec миллисекунд должно восстанавливаться исполнение, остановленное строкой suspend;
Вот только suspend; не останавливает исполнение =\

Arrest
04-11-2007, 18:42
setTimeout("alert('hello')",1250);
http://www.sean.co.uk/a/webdesign/javascriptdelay.shtm

функция pause:
function pause(millis)
{
setTimeout(";", millis);
}
по-моему так (c)
; - такая операция в javascript вообще есть? :)

Coutty
04-11-2007, 19:15
Хм... Как-то я не могу связать.

Вот код:
<html>
<head>
<title>1</title>
<style>
body {font-size:0px;}
</style>
</head>
<body onLoad=mov();>
<div id="id1" style="background-color:red; top:100; left:100; position:absolute; width:2; height:2"></div>
<script>
<!--
function mov2() {
var div = document.getElementById("id1");
var temp = div.style.top.substr(0,3);
div.style.top = temp++;
}

function mov() {
setTimeout("mov()",100);
mov2();
}
//-->
</script>
</body>
</html>

По идее функция mov() должна вызываться рекурсивно каждые 100 мс и с каждой итерацией вызывать mov2(), которая будет сдвигать красную точку на 1 пиксель вниз. Собственно, функция отрабатывает как раз через равные интервалы, но появилась новая проблема - в div.style.top каждый раз оказывается одно и то же значение =( Почему?(

Если же сделать функцию pause:function pause(millis)
{
setTimeout(";", millis);
} »
то цикл, перемещающий слой отрабатывает на максимальной скорости, а потом через заданный интервал срабатывает "пауза" =)

Arrest
04-11-2007, 20:15
а она точно отрабатывает? может
function mov() {
mov2();
setTimeout("mov()",100);
}

Coutty
04-11-2007, 20:55
Arrest, точно отрабатывает в том порядке, как я написал. Ставил для отладки интервал 3000 и в mov2() дописывал alert(div.style.top);
Каждые 3 секунды выскакивает окошко с числом 101. Т.е. оно как бы изменяется, но потом загадочным образом возвращается в по-умолчательское положение.

Arrest
04-11-2007, 22:17
Coutty
<html>
<head>
<title>1</title>
<style>
body {font-size:0px;}
</style>
</head>
<body onLoad=mov();>
<div id="id1" style="background-color:red; top:100; left:100; position:absolute; width:2; height:2"></div>
<script>
<!--
var tp = parseInt(document.getElementById("id1").style.top.substr(0,3));

function mov2() {
tp = tp+1;
sync();
}

function sync(){
document.getElementById("id1").style.top = tp+"px";
}

function mov() {
setTimeout("mov()",1000);
mov2();
}
//-->
</script>
</body>
</html>

Opera 9.2, работает.

Sham
05-11-2007, 00:30
window.setInterval("alert('Есть такой метод!')", 1000); // забываем...

Coutty
05-11-2007, 09:48
Arrest, здорово, работает))) Надо было-то всего лишь глобальную переменную объявить)

Sham, setInterval тоже работает, но... как её остановить вовремя? Скажем, мне нужно только 100 итераций.
Писать что-то вроде:


var t = 100;
function temp1(){
if (t>0)
{
mov2();
t--;
}
}

function mov() {
window.setInterval("temp1()",1000);
}
Но она будет каждые 1000 мс отъедать кусочек процессорного времени. Или можно сделать какой-нибудь window.stopTimer?)

Хотя, думаю, что у неё просто другое предназначение.

Всем спасибо за помощь! Ня)

Sham
05-11-2007, 19:14
Coutty, rtfm
id = window.setInterval("alert('Есть такой метод!')", 1000); // поехали...
window.clearInterval(id); // тормоз...

Coutty
05-11-2007, 20:10
Sham, спасибо) У меня нет tfm, т.ч. я не могу его r =Р




© OSzone.net 2001-2012