Показать сообщение отдельно
  #17 (permalink)  
Старый 20.03.2014, 16:03
Интересующийся
Отправить личное сообщение для Drugpunker Посмотреть профиль Найти все сообщения от Drugpunker
 
Регистрация: 19.03.2014
Сообщений: 23

Всем снова здравствуйте.

Заработал таки таймер у меня.
Но, проблему с выполнением нескольких таймеров так и не решил.

Срабатывает только последний из всех.
  • В цикле PHP выдаются таблицы с событиями, которые произойдут в конкретные Дату и Время.
  • Соответственно, напротив каждого события должен висеть таймер обратного отсчёта

Моя реализация:
  1. Кусок кода PHP(в цикле):
    выбираю данные из базы и применяю к ним функцию countdown()
$unix_date = $row_auct_select->start_date;
		$unix_time = $row_auct_select->start_time;
		$day = date ('d', $unix_date);
		$month = date ('n', $unix_date);
		$year = date('Y', $unix_date);
		$time = date ('H:i:s', $unix_time);
echo "
<td>

<span id='$Zapros_iz_bd_(id_продукта)'>
		
</span>

<script language='javascript'>
countdown(".$unix_date.",".$unix_time.",".$Zapros_iz_bd_(id_продукта)."</script>
	
</td>
";

  1. Собственно, функция на JS:

function countdown(a_date,a_time,a_id)
{
	span_id = document.getElementById(a_id);
	montharray = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	auct_date = new Date(parseInt(a_date) * 1000);
	auct_time = new Date(parseInt(a_time) * 1000);
	
	var auct_year = auct_date.getYear(); if (auct_year < 1000) auct_year += 1900
    var auct_month  = auct_date.getMonth()
    var auct_day = auct_date.getDate()
    var auct_hour = auct_time.getHours()
    var auct_minute = auct_time.getMinutes()
    var auct_second = auct_time.getSeconds()

    var futurestring = montharray[auct_month]+" "+auct_day+", "+auct_year+" "+auct_hour+":"+auct_minute+":"+auct_second
  
    function calculate()
	{
		res = Date.parse(futurestring) - new Date()
                res_day = Math.floor(res/(60*60*1000*24)*1)
                res_hour = Math.floor((res%(60*60*1000*24))/(60*60*1000)*1)
                res_min = Math.floor(((res%(60*60*1000*24))%(60*60*1000))/(60*1000)*1)
                res_sec = Math.floor((((res%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1)

			if (res > 0) 
		    {
				span_id.innerHTML = res_day+" д. "+"<br/>"+res_hour+":"+res_min+":"+res_sec
                setTimeout( calculate ,1000);
		    }
		    else
		    {
				span_id.innerHTML = "Всё проехали";
		    }
 
		
	}
	calculate();

}

  • Идентификатор каждого SPAN уникальный, но всё равно работает только в последней таблице...........?
  • И как реализовать так, чтобы надпись по истечении времени таймера не "передёргивалась", не попадала в цикл функции JS?
    В данной реализации надпись висит секунду, а затем наследует предыдущий таймер...

Видел похожие примеры, но так и не смог добиться поставленной задачи
Ответить с цитированием