aleksejm Posted July 23, 2007 Report Share Posted July 23, 2007 Короче надо замутить таймер который бы показывал сколько времени человек провел на сайте на яваскрипте.У самого никак не получается Link to comment Share on other sites More sharing options...
0 Tokolist Posted July 23, 2007 Report Share Posted July 23, 2007 А что не получается?onload + setInterval (если после загрузки страницы)или просто setInterval "как можно выше"считаем сколько раз выполнилась ф-я, умножаем на интервал и приводим к гуманному виду Link to comment Share on other sites More sharing options...
0 AKS Posted July 24, 2007 Report Share Posted July 24, 2007 ...считаем сколько раз выполнилась ф-я, умножаем на интервал...Наверно надежней будет использовать объект Date. А то метод window.setInterval, например в "хваленом" Gecko, может выдать "кривые" результаты... Link to comment Share on other sites More sharing options...
0 aleksejm Posted July 24, 2007 Author Report Share Posted July 24, 2007 Я просто по книжки учюсь а там в конце главы задание вот сделайте такой таймер использую материалы данной главы.Про онлоад там говорилось но вот про setInterval нет.Нужно как-то это сделать с помощью объекта Date Link to comment Share on other sites More sharing options...
0 Tokolist Posted July 24, 2007 Report Share Posted July 24, 2007 Наверно надежней будет использовать объект Date. А то метод window.setInterval, например в "хваленом" Gecko, может выдать "кривые" результаты...Будем не соглашаться с Вами, коллега Представим ситуацию:Захожу я на страничку... Просматриваю 5 мин. потом вдруг замечаю, что часы на компе идут не точно (начинаются новости по телеку)... вот блин 10 мин. разницы... устанавливаю часы на компе правильно... просматриваю страничку еще 5 мин.... и что получается? а получается то, что провел я согласно Ваших данных на страничке не 10, а 20 мин. Или еще одна невероятная история:Винда автоматически перевела часы с летнего на зимнее время :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);}GO GOИ что мы имеем? Таблица результатов (в миллисекундах):IE 6 87FF 2 7~8FF 1.5 16Op 9.0 первый раз 246 !!!! потом 86~87MZ 7~16Safari B3 86Тестировал для каждого из браузеров по несколько раз.Какие выводы можно сделать:1. разница между Date и setInterval действительно есть (но эксперимент был не совсем чист если смотреть код)2. "хваленый" Gecko не так уж и плох, особенно в ФФ23. разработчики ФФ действительно совершенствуют свой продукт4. скорей-всего Опере нужна какая-то первичная инициализация таймера (или это просто баг)Тест конечно не претендует на звание истины, но......если считать, что Date - идеал (хотя это не всегда так), то мы получаем разницу, грубо говоря, 80 миллисекунд на каждую МИНУТУ и того мы получим погрешность в 1 секунду через 1 / 0.08 ~= 13 мин., что не совсем уж ИМХО критично.не исключено также, что я что-то где-то напутал или просчитался Link to comment Share on other sites More sharing options...
0 AKS Posted July 25, 2007 Report Share Posted July 25, 2007 Будем не соглашаться с Вами, коллега Так я ведь и написал: "Наверно надежней будет...", т.к. у меня нет твердой уверенности (не все еще я видел в этой жизни )....устанавливаю часы на компе правильно...На компе ведь много чего можно установить, чтобы "поломать" клиентский сценарий. В Opera, например, есть возможность добавить User JavaScripts, который будет "вытворять" с вашей web-страничкой вообще совершенно непредсказуемые вещи...Винда автоматически перевела часы с летнего на зимнее время...Ага! Сидите Вы в баре, пьете целый час (с радости или с горя, как в американском мультике про волка: "А ребята пью-ю-ют!"). Вот Вы напились в "хлам" за час, и вдруг время перевели назад. Тут все начинают на Вас пальцем показывать, ухахатываясь: "Во напи-и-ился за пару секунд!!!" Что я этим хочу сказать? Перевод времени - явление глобальное, "встрять" можно где-угодно, не только на чьем-то сайте.разница между 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 More sharing options...
0 aleksejm Posted July 25, 2007 Author Report Share Posted July 25, 2007 Tokolist я посмотрел твой скрипт и не понял только один момент now = new Date() - now; . Ты из сегодняшней даты вычитаешь ее же? Link to comment Share on other sites More sharing options...
0 aleksejm Posted July 25, 2007 Author Report Share Posted July 25, 2007 <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 More sharing options...
0 AKS Posted July 25, 2007 Report Share Posted July 25, 2007 window.setInterval(startTest, 1000);function startTest() { var span2 = document.getElementById('timetable'), date = (new Date).toUTCString(), time = date.match(/sdd:dd:dds/); span2.innerHTML = 'Вы находитесь на сайте уже' + time;} Link to comment Share on other sites More sharing options...
0 Tokolist Posted July 26, 2007 Report Share Posted July 26, 2007 Tokolist я посмотрел твой скрипт и не понял только один момент now = new Date() - now; . Ты из сегодняшней даты вычитаешь ее же?там есть ещеnow = new Date();и это просто тест, а не готовый кодAKSтолько надо еще доработать, поскольку нам не текущее время нужно, а сколько времени провели на сайте или я чего-то недопонял? В Opera, например, есть возможность добавить User JavaScriptsДа, но если я добавляю юзерский скрипт, то знаю для чего и что он делает, а время изменить можно не подозревая, что этим мы что-то испортим Ага! Сидите Вы в баре...угу, и такое бывает Конечно есть! Если, к примеру, в IE или в Opera выскочит окошко...Мда... а я то наивный полагал, что дело только в неточности Особенно порадовал Gecko Link to comment Share on other sites More sharing options...
0 AKS Posted July 27, 2007 Report Share Posted July 27, 2007 только надо еще доработать... или я чего-то недопонял? Не-е-е! Это я недопонял, а точнее поторопился - написал не то.Да, но если я добавляю юзерский скрипт, то знаю для чего и что он делает, а время изменить можно не подозревая, что этим мы что-то испортим Да я про userscripts писал в ином контексте - к тому, что если пользователь будет часы переводить или еще чего делать (скрипты свои совать, например), то ни-и-икак не сделать что-нибудь безупречное. Link to comment Share on other sites More sharing options...
0 AKS Posted July 27, 2007 Report Share Posted July 27, 2007 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 More sharing options...
0 Tokolist Posted July 28, 2007 Report Share Posted July 28, 2007 Сейчас, кстати, как раз пытаюсь с божьей помощью (точнее сказать, с помощью 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 More sharing options...
0 AKS Posted July 29, 2007 Report Share Posted July 29, 2007 Я пытался что-нибудь придумать...Вот в этой теме можете взглянуть на то, как "рождалось"-писалось то, что я упомянул выше (в смысле эмуляция setInterval/setTimeout). А вот здесь я попытался объяснить "произошедшее"... Link to comment Share on other sites More sharing options...
Question
aleksejm
Короче надо замутить таймер который бы показывал сколько времени человек провел на сайте на яваскрипте.У самого никак не получается
Link to comment
Share on other sites
13 answers to this question
Recommended Posts