Есть функция - таймер обратного отсчета. Нужно сделать фишку как на аукционах - типа перечень товаров на странице и под каждым идет отсчет времени до окончания приема ставок. Как для одного блока запустить таймер - не проблема. А как для нескольких? [js]function timer(timestamp) { var d = new Date(); var timerspan = ge('timer'); var r = timestamp - d.getTime(); if(r > 0) { var result = ''; var m1 = Math.floor(r / 86400000);//day var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000); if(m1 >= 1) result += m1+'д. '; result += m2+'ч. '+m3+'м. '+m4+'сек.'; timerspan.innerHTML = result; } else timerspan.innerHTML = 'Истекло'; } function aa() { var a = timer(1277857786000); } setInterval(aa, 1000);[/js] <span id="timer"></span> timer() принимает метку времени в микросекундах от 1970г, потом отнимает текущее время и преобразует в норм. вид. Вот допустим, будет куча спанов <span id="timer2"></span>, <span id="timer3"></span> ... как для каждого стартовать timer() ?
Например так: [js]function run(general) { for(var i = 0; ;i++) { var timeable = document.getElementById(general + "-" + i); if(typeof(timeable) != "undefined") { // Start } else break; } }[/js]
Всеравно непонятно. Еще раз для себя повторюсь [js]function timer(timestamp) { var d = new Date(); var timerspan = ge('timer-1'); var r = timestamp - d.getTime(); if(r > 0) { var result = ''; var m1 = Math.floor(r / 86400000);//day var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000); if(m1 >= 1) result += m1+'д. '; result += m2+'ч. '+m3+'м. '+m4+'сек.'; timerspan.innerHTML = result; } else timerspan.innerHTML = 'Истекло'; }[/js] <span id="timer-1">1277857786000</span><br> <span id="timer-2">1277257786000</span> Функция + 2 спана. Допустим, в timer() передаем время путем изъятия числа из тега через innerHTML. Теперь у функции есть время и доступ к спану, чтобы "щелкать" секунды счетчика. Как запустить одновременно для двух этих спанов? Если привязать к каждому спану событие, например, onclick то все ясно. Но это не то.
Опишу алгоритм: 1. При загрузке документа существует куча span-ов с разным временем. 2. Собираем по какому-нибудь критерию все эти span-ы 3. По-одиночке читаем из них время, формируем объект Date именно с этого времени 4. Начинаем отсчет для каждого span-a путем привязки к нему функции. Чуть позже напишу пример.
Простейший пример без математических рассчетов: HTML: <html> <head> <title>Sample</title> <script> function Run(id) { setInterval(function() { id.innerText = new Number(id.innerText) + 1; }, 1000); }; window.onload = function() { for(var i = 1;; i++) { var element = document.getElementById("sample-" + i); if(element) { Run(element); } else break; } } </script> </head> <body> <span id="sample-1">1277737244</span> <span id="sample-2">1277737251</span> <span id="sample-3">1277737264</span> </body> </html>
[js]<script language="javascript"> function timer(id) { var d = new Date(); var timestamp = ge('start-'+id).innerHTML; var r = timestamp - d.getTime(); if(r > 0) { var result = ''; var m1 = Math.floor(r / 86400000);//day var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000); if(m1 >= 1) result += m1+'д. '; result += m2+'ч. '+m3+'м. '+m4+'сек.'; ge('timer-'+id).innerHTML = result; } else ge('timer-'+id).innerHTML = 'Истекло'; } function Run(id) { setInterval(function(){timer(id);}, 1000); } window.onload = function() { for(var i = 1;; i++) { var element = ge('start-'+i); if(element) Run(i); else break; } } </script>[/js] HTML: <span id="timer-1"></span><span id="start-1" style="display:none">1277857786000</span><br> <span id="timer-2"></span><span id="start-2" style="display:none">1277857386000</span> Все работает как надо. Единственное не то, что дублировать спан пришлось для хранения точки отсчета. Apple Спасибо, помог.
Зачем? Существуют атрибуты, в них можно хранить что угодно. Смотри: HTML: <span id="timer-2" start="10" finish="20">Something here</span> [js]window.onload = function() { var element = document.getElementById("timer-2"); // Читаем атрибуты var time_start = element.getAttribute("start"); var time_finish = element.getAttribute("finish") }[/js] Я писал очень большой проект для одного московского пентхауса, там на странице было около 500 блоков. Каждый блок был ячейкой таблицы и у каждого из блоков мог быть свой цвет, привязанный контент, и, главное, непосредственная связь с навигационным меню, в котором было всего 20 элементов, но у них была тесная взаимная связь с обоими менюшками. Как бы это сделать без атрибутов? Все способы в десятки раз более затратные.
Apple Хм, я думал впихнуть в какойто атрибут стартовое число (в title="" например и юзать как getElementById('any').title). Не знал про то что свои произвольные можно задавать.
Ты о чем? Какая нафиг спецификация? Есть спецификация XML, которая позволяет эти манипуляции на всех уровнях. Это абсолютно допустимо размечать не только свои атрибуты, но и теги, и объекты.
я не про xml хотят же в html впендюрить строгость. когда если че не так - броузер не игнорит, а ненавидит всех и вся.