Jump to content
  • 0

Таймер на яваскрипте


aleksejm
 Share

Question

13 answers to this question

Recommended Posts

  • 0

А что не получается?

onload + setInterval (если после загрузки страницы)

или просто setInterval "как можно выше"

считаем сколько раз выполнилась ф-я, умножаем на интервал и приводим к гуманному виду :)

Link to comment
Share on other sites

  • 0
...считаем сколько раз выполнилась ф-я, умножаем на интервал...

Наверно надежней будет использовать объект Date. А то метод window.setInterval, например в "хваленом" Gecko, может выдать "кривые" результаты...

Link to comment
Share on other sites

  • 0

Я просто по книжки учюсь а там в конце главы задание вот сделайте такой таймер использую материалы данной главы.Про онлоад там говорилось но вот про setInterval нет.Нужно как-то это сделать с помощью объекта Date

Link to comment
Share on other sites

  • 0
Наверно надежней будет использовать объект Date. А то метод window.setInterval, например в "хваленом" Gecko, может выдать "кривые" результаты...

Будем не соглашаться с Вами, коллега :P

Представим ситуацию:

Захожу я на страничку... Просматриваю 5 мин. потом вдруг замечаю, что часы на компе идут не точно (начинаются новости по телеку)... вот блин 10 мин. разницы... устанавливаю часы на компе правильно... просматриваю страничку еще 5 мин.... и что получается? а получается то, что провел я согласно Ваших данных на страничке не 10, а 20 мин. :)

Или еще одна невероятная история:

Винда автоматически перевела часы с летнего на зимнее время :P :P

но я на этом не остановился и начал тестить setInterval vs Date. Сообразил небольшой код

quot;-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<script type="text/javascript">

var seconds = 60;

var intervalCount;

var now;

var timer;

intervalFunction = function() {

intervalCount++;

if (intervalCount >= seconds) {

clearInterval(timer);

now = new Date() - now;

window.alert("[interval= + 1000*intervalCount + ] vs [date= + now + ]: " + (1000*intervalCount - now));

}

}

startTest = function() {

intervalCount = 0;

now = new Date();

timer = window.setInterval(intervalFunction, 1000);

}

И что мы имеем? Таблица результатов (в миллисекундах):

IE 6 87

FF 2 7~8

FF 1.5 16

Op 9.0 первый раз 246 !!!! потом 86~87

MZ 7~16

Safari B3 86

Тестировал для каждого из браузеров по несколько раз.

Какие выводы можно сделать:

1. разница между Date и setInterval действительно есть (но эксперимент был не совсем чист если смотреть код)

2. "хваленый" Gecko не так уж и плох, особенно в ФФ2

3. разработчики ФФ действительно совершенствуют свой продукт

4. скорей-всего Опере нужна какая-то первичная инициализация таймера (или это просто баг)

Тест конечно не претендует на звание истины, но...

...если считать, что Date - идеал (хотя это не всегда так), то мы получаем разницу, грубо говоря, 80 миллисекунд на каждую МИНУТУ и того мы получим погрешность в 1 секунду через 1 / 0.08 ~= 13 мин., что не совсем уж ИМХО критично.

не исключено также, что я что-то где-то напутал или просчитался :)

Link to comment
Share on other sites

  • 0
Будем не соглашаться с Вами, коллега :)

Так я ведь и написал: "Наверно надежней будет...", т.к. у меня нет твердой уверенности (не все еще я видел в этой жизни :P ).

...устанавливаю часы на компе правильно...

На компе ведь много чего можно установить, чтобы "поломать" клиентский сценарий. В Opera, например, есть возможность добавить User JavaScripts, который будет "вытворять" с вашей web-страничкой вообще совершенно непредсказуемые вещи...

Винда автоматически перевела часы с летнего на зимнее время...

Ага! Сидите Вы в баре, пьете целый час (с радости или с горя, как в американском мультике про волка: "А ребята пью-ю-ют!"). Вот Вы напились в "хлам" за час, и вдруг время перевели назад. Тут все начинают на Вас пальцем показывать, ухахатываясь: "Во напи-и-ился за пару секунд!!!" :P

Что я этим хочу сказать? Перевод времени - явление глобальное, "встрять" можно где-угодно, не только на чьем-то сайте.

разница между Date и setInterval действительно есть...

Конечно есть! Если, к примеру, в IE или в Opera выскочит окошко подтверждения (confirm) или alert какой-нибудь, то Ваш window.setInterval вообще "забудет" про интервальную функцию ("вспомнит" лишь тогда, когда окно предупреждения будет закрыто). Вот пример:

var i = 0,
k = 10,
d = new Date,
id = window.setInterval(I, 1000);

/*
while (k--) {
window.setInterval(function () {}, 1000);
}
*/

function I() {
i++;
if (i >= 10) {
window.clearInterval(id);
window.alert([(new Date) - d, i]);
}
}

А для кнопки GO-GO напишите onclick='window.confirm("?")'. Кстати, закомментированный блок - это для Gecko (раскомментируйте, чтобы увидеть то, о чем я писал ранее).

Link to comment
Share on other sites

  • 0

<script type="text/javascript" language="javascript">
var s = 00;
m = 00;
h = 00;
starttimer = function() {
setInterval("startTest()",1000);
}
startTest = function() {
s++;
if(s >= 60) {
m++;
s -= 60;
}
if(m >= 59 && s >= 59) {
m = 0;
s = 0;
h++;
}
if(s <= 9) s1 = "0"; else s1 = '';
if(m <= 9) m1 = "0"; else m1 = '';
if(h <= 9) h1 = "0"; else h1 = '';
span2 = document.getElementById('timetable')
span2.innerHTML = 'Вы находитесь на сайте уже ' + h1 + h + ':' + m1 + m + ':' + s1 + s;
}
</script>

Вот замутил свой таймер.Вроде должен работать

Link to comment
Share on other sites

  • 0
Tokolist я посмотрел твой скрипт и не понял только один момент now = new Date() - now; . Ты из сегодняшней даты вычитаешь ее же?

там есть еще

now = new Date();

:)

и это просто тест, а не готовый код

AKS

только надо еще доработать, поскольку нам не текущее время нужно, а сколько времени провели на сайте :P или я чего-то недопонял? :P

В Opera, например, есть возможность добавить User JavaScripts

Да, но если я добавляю юзерский скрипт, то знаю для чего и что он делает, а время изменить можно не подозревая, что этим мы что-то испортим :P

Ага! Сидите Вы в баре...

угу, и такое бывает :)

Конечно есть! Если, к примеру, в IE или в Opera выскочит окошко...

Мда... а я то наивный полагал, что дело только в неточности :P Особенно порадовал Gecko :)

Link to comment
Share on other sites

  • 0
только надо еще доработать... или я чего-то недопонял? :)

Не-е-е! Это я недопонял, а точнее поторопился - написал не то.

Да, но если я добавляю юзерский скрипт, то знаю для чего и что он делает, а время изменить можно не подозревая, что этим мы что-то испортим :P

Да я про userscripts писал в ином контексте - к тому, что если пользователь будет часы переводить или еще чего делать (скрипты свои совать, например), то ни-и-икак не сделать что-нибудь безупречное.

Link to comment
Share on other sites

  • 0

Tokolist

Вот такая конструкция должна работать, как было задумано:

window.setInterval(startTest, 1000, new Date);

function startTest(aDate) {
var span2 = document.getElementById('timetable'),
currentDate = new Date,
differens = (currentDate - aDate) / 1000,
spentTime;
currentDate.setUTCHours(0);
currentDate.setUTCMinutes(0);
currentDate.setUTCSeconds(differens);
spentTime = currentDate.toUTCString().match(/sdd:dd:dds/);
span2.innerHTML = 'Вы находитесь на сайте уже' + spentTime;
}

Только для IE придется переделать window.setInterval, чтобы он мог получить new Date третьим параметром (или просто вытащить стартовую дату в global scope).

Сейчас, кстати, как раз пытаюсь с божьей помощью (точнее сказать, с помощью Zeroglif) переписать window.setInterval для IE.

Link to comment
Share on other sites

  • 0
Сейчас, кстати, как раз пытаюсь с божьей помощью (точнее сказать, с помощью Zeroglif) переписать window.setInterval для IE.

В принципе и глобальной области видимости должно хватать...

У window, к сожалению, нет свойства prototype :)

Я пытался что-нибудь придумать... вот на этом я застрял :) да и криво как-то, особенно если интервал будет маленький...

var timerValues = new Array();
setIntervalEx = function(func, interval) {
var timer = window.setInterval(intervalFunction, interval);
var argsArray = new Array();

for (i = 2; i < arguments.length; i++) {
argsArray.push(arguments[i]);
}

timerValues[timer] = argsArray;
}

clearIntervalEx = function(ID) {

}

intervalFunction = function() {

}

Link to comment
Share on other sites

  • 0
Я пытался что-нибудь придумать...

Вот в этой теме можете взглянуть на то, как "рождалось"-писалось то, что я упомянул выше (в смысле эмуляция setInterval/setTimeout). А вот здесь я попытался объяснить "произошедшее"...

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy