Есть скрипт таймера. Выкладывать весь, думаю, смысла нет. Таймер выводится так: Код (PHP): $("#clock").html(day+':'+hour+':'+min+':'+sec); Т.е. таймер выводится в элементе с идентификатором clock. Для того, чтобы вывести еще один таймер на той же странице с другим отсчетом, мне приходится на странице html прописывать еще один элемент с другим идентификатором, например, clock2: Код (PHP): $("#clock2").html(day+':'+hour+':'+min+':'+sec); Как реализовать вывод на странице неопределенного количества таймеров, если они с разным отсчетом времени? Например, пользователь в он-лайн игре отправляет юнита из точки А в точку Б и при этом запускается таймер времени прибытия этого юнита. Один таймер вывести – не проблема, но если пользователь отправит N – количество юнитов, т.е. если нужно вывести N-количество таймеров с разным отсчетом времени – как такое можно сделать? PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Может быть и нет, но в принципе, именно от него зависит возможность реализации мультитаймера. Вот, набросал простой пример, который, при желании, можно расширить, доработать под свои нужды. Код (PHP): Timer 1: <span class="timer"></span><button>Start</button><br> Timer 2: <span class="timer"></span><button>Start</button><br> Timer 3: <span class="timer"></span><button>Start</button><br> Код (PHP): (function(){ $.fn.multitimer = function(){ var methods = { init: function(i, el){ var o = this; $(el).on('click', function(){ o.start(i, $(this).hide().prev('span').text(0)); }); }, start: function(i, el){ this.clear(i); this.increase(el); this.intervals[i] = setInterval(this.increase, 1000, el); }, increase: function(el){ el.text(parseFloat(el.text()) + 1); }, clear: function(i){ clearInterval(this.intervals[i]); }, intervals: [] }; return this.each(function(i){ methods.init(i,this); }); }; })(); $('button').multitimer();
Критика к реализации: таймер, инкремент которого основан чисто на сетинтервалах не надежен и не точен, он завязан на выделении процессорного времени, которое завязано на воле планировщика. Через некий промежуток времени, который предсказать тоже нельзя, показания этого таймера не будут иметь ничего общего с реально прошедшим временем. Поставь интервал в 1 миллисекунду и запусти такой таймер параллельно с реальным секундомером. Увидишь разницу очень быстро. Чтобы такого не было, при каждом вызове increase() нужно добавлять к текущему значению не единичку, а разницу между временем последнего вызова и временем вызова текущего. То есть ты, по факту добавишь реально прошедшее время, а не количество вызовов функции. То есть, по сути, таймер собран правильно, но increase() надо чуть переписать.
Твой таймер - сломать мозг можно, без обид, выкладываю свой таймер обратного отсчета, посмотри его, плиз, может, ты со свежей головой, идейку подкинешь, ибо мой мозг уже кипит: script.js: Код (PHP): $(document).ready(function () { function get_timer(d,obj) { //obd - переменная хранит идентификатор элемента, в который выводим таймер //d - переменная хранит дату и время, до которого таймер ведет обратный отсчет this.date_future = new Date(d); this.date = new Date(); this.timer = this.date_future - this.date; if(this.timer > 0) { this.day = parseInt(this.timer/(60*60*1000*24)); this.hour = parseInt(this.timer/(60*60*1000))%24; this.min = parseInt(this.timer/(1000*60))%60; this.sec = parseInt(this.timer/1000)%60; $(obj).html(this.day+':'+this.hour+':'+this.min+':'+this.sec+'<BR>'); setTimeout(function() { return get_timer(d,obj); },1000); } else { $("#clock").html("<span id='stop'>Отсчет закончен</span>"); } } }); функцию таймера вызываю из html.php: Код (PHP): <?php $date1=date("m").','.date("d").','.date("Y").' '.(date("H")+2).':'.date("i").':'.date("s"); $date2 = date("m").','.date("d").','.date("Y").' '.(date("H")+1).':'.date("i").':'.date("s"); $obj1='#clock'; $obj2='#clock2'; ?> <div id="clock"></div> <div id="clock2"></div> <SCRIPT LANGUAGE="JavaScript"> tt = new get_timer("<? echo $date1; ?>","<? echo $obj1; ?>"); tt2 = new get_timer("<? echo $date2; ?>","<? echo $obj2; ?>"); </SCRIPT> PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Его таймер написан так, как его писал бы человек, знающий JS. В то же время твой таймер написан так, как его писал бы человек, не знающий JS, и, по этому, пишущий на JS как на PHP или любом другом знакомом языке. И по этому код, который написал Deonis, выносит тебе мозг. Лично для меня он вполне логичен и очевиден. И да, тебя не смущает, что у тебя код с неразматывающейся вечной рекурсией из-за таймаутов? У Deonis в коде SetInterval не для красоты стоит. И ты не учел проблему, которую я описывал выше.
Таймер, который я скинул, - сомневаюсь, что написал его невежда. Источник здесь: http://webformyself.com/tajmer-obratnogo-otscheta-dlya-sajta/ о чем ты? В моем таймере нет increase(). Если тебя не затруднит, покажи, что не так именно в моем примере таймера.
Да, тут таймер действительно растет не на единичку, а на разницу во времени. был бе невеждой, знал бы, что в JS можно нативно работать с датой и получать из нее дни, часы и тд, а не городить И писал бы на JS как на JS, а не как на PHP. То, что он решил, что может учить других, не делает его гуру. Это лишь самомнение, не более.
Код (PHP): this.day = parseInt(this.timer/(60*60*1000*24)); this.hour = parseInt(this.timer/(60*60*1000))%24; this.min = parseInt(this.timer/(1000*60))%60; this.sec = parseInt(this.timer/1000)%60; - ну если ты раскритиковал этот кусок кода, то будь, плиз, последователен, напиши, как нужно сделать правильно.. И хотелось бы услышать ответ на главной вопрос этой темы. Если он (ответ) есть. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Эхехе. У Date куча нативных методов для возврата минут, секунд и даже дня недели. https://learn.javascript.ru/datetime Добавлено спустя 2 минуты 46 секунд: Вот, держи, я давно уже писал одному падавану как пример. Тоже таймер. Считающий от миллисекунд до годов. С функцией паузы и сброса. Правда, там куда-то отступы поплыли после обновления JSFiddle. Но не суть. Да, там тоже есть громоздкая конструкция весьма, но она продиктована хитровыбоенными требованиями к форматированию вывода. Плюс, оно умеет считать от указанного времени.В поле ввода можно вводить дату в любом из известных стандартов. Можно хоть 1 april 2015 вбить.
гм, интересно.. А если переводить миллисекунды в дни, часы, минуты и секунды моим способом, то в чем будет проигрыш? Будет выше нагрузка на процессор? Или это в принципе не корректное написание кода? Или еще что-то? Ведь мой скрипт- то работает. Но твой вариант мне нравится больше.
Ну гляди. Можно зубы дергать через рот. А можно через зад. И то и то работает. Но через рот правильно, а через зад нет. Вопрос удобства. Если уже есть инструменты, которые делают что-то, зачем самому их заново изобретать? Нет, для общего развития и понимания оно может и полезно, но, как вариант, точное время, прошедшее с такой-то вот даты ты так не посчитаешь. Просто потому, что месяц это не 31 день. Есть месяцы и по 30, а есть вообще февраль. Ты сможешь посчитать только до дней. Количество месяцев и дней ты уже посчитать не сможешь точно в сумме. Вообще для дат лучше никогда не городить костыли. Даты это грабли. Ты миллисекунды считаешь в десятичной системе. Секунды и минуты в шестидесятиричной(!), в то время как часы в двадцатьчетыричной. Дни при этом в тридцати/тридцатиодно\двадцативосьми\двадцатидевяти- ричных системах в зависимости от того, в какой месяц они перешли, а месяцы в тринадцатиричной. При том, что месяцы складываются в десятичные годы. Подумай об этом. Как по мне, для работы с этим лучше использовать готовые решения.
Братан, я опять с тобой вынужден не согласиться. Опять и снова Эти 4 строки в моем примере таймера, о которых мы с тобой говорили, они вычисляют НЕ дату (и время), а разницу между двумя датами, между будущей датой и настоящей: Код (PHP): day = parseInt(timer/(60*60*1000*24)); hour = parseInt(timer/(60*60*1000))%24; min = parseInt(timer/(1000*60))%60; sec = parseInt(timer/1000)%60; В переменной timer хранится разница в секундах между двумя датами: Код (PHP): //date_future - хранит заданную дату и время, до которого таймер будет считать. date_future = new Date("12,13,2015 14:58:08"); //date - хранит настоящее дату и время. date = new Date(); //timer - разница в секундах. timer = date_future - date; Если верхние 4 строки переписать по твоему примеру, т.е. вот так: Код (PHP): day = date_future.getDate()-date.getDate(); hour = date_future.getHours()-date.getHours(); min = date_future.getMinutes()-date.getMinutes(); sec = date_future.getSeconds()-date.getSeconds(); То в таймере будут отрицательные значения времени. Например: если в переменной date_future будет указано время на 1 час больше настоящего, а минуты - на 5 меньше, то счетчик будет тикать с отрицательным значением. Т.е. если в переменной date_future время будет, допустим, 13:40, а в переменной date - 12:45, то счетчик выдаст минус из-за разницы минут: 40 мин. - 45 мин. = -5 мин. Твой пример хорош, но, думаю, не в этом случае. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
То, что ты написал, никак не относится к моему примеру. Просто из одной даты вычитай другую, а потом просто получай нужную ее компоненту. Посмотри внимательней, как это у меня работает. И что там происходит. Повбивай даты месяц назад или с начала месяца. Все работает. И никаких отрицательных значений. И никаких вычитаний компонент дат друг из друга. Вбей туда 1 december 2015 или любую другую дату в таком виде. И посмотри, как оно считает.
так в том и дело, что в твоем таймере этого нет. Твой и мой таймеры принципиально разные. Твой считает без конца, пока пользователь сам его не остановит, а в моем случае - считает до определенной даты и времени, из-за чего в моем примере вычисляется разница в секундах, которая затем переводится в часы и т.д. ну так это и делается в моем таймере: Код (PHP): date_future = new Date(d); date = new Date(); timer = date_future - date; timer получает разницу в секундах. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
В чем принципиальная разница? В условии остановки? if (время старта+прошедшее_время==время_остановки){стопори()} вместо нажатия на кнопку?
Неа, в том, что у тебя считает вперед, так сказать, на возрастание ( т.е. 0,1,2,3 и т.д.), а у меня тикает в обратную сторону (9,8,7 и т.д.), на убывание, пока не достигнет заданной даты. И поэтому, в моем случае, нужно интервалом в секунду отображать оставшееся время от начала отсчета до заданного. Именно оставшееся время. А как его можно определить иным способом?
Ну а в чем проблема вычитать время, я не пойму? Ну получается оно отрицательное, дальше что? Плюсуй отрицательное время, получишь вычитание.
A+(-B) = A-B же. Сильно ты издалека заходишь с просьбой написать тебе рабочий вариант, если честно Если вечером будет время, ок, помогу.
Почему не работает ?: Код (PHP): <form> <button>START</button> </form> <script type ="text/javascript"> $(function(){ $('button').on({click: function(e) { var war = $(this); war.document.write('ura'); } }); }); </SCRIPT>
А на каком языке это написано? Это не чистый JS. И не JQuery. По этому и не работает, наверное. P.S. 6000й пост на форуме. Юбилей, однако.
Это JQuery. Вот ссылочка на урок по обработчикам событий: http://jquery.page2page.ru/index.php5/On В чем я ошибся, кто разбирается? Прошу помощи. Код (PHP): <html> <head> <meta http-equiv="content-type" content="text/html" charset="windows-1251"> <script type="text/javascript" src="js/jquery-2.1.4.js"></script> <title></title> </head> <body> <form> <button>START</button> </form> <script type ="text/javascript"> $(document).ready(function () { $('button').on({click: function(e) { var ww = $(this); ww.document.write('www'); }, mouseenter: function() { // действия в ответ на наведение мыши на элемент } }); }); </SCRIPT> </body> </html>