Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP+JS отсчёт времени до события.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Zuldek
Отправлено: 24 Декабря, 2010 - 13:58:24
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Своял скрипт отсчитывающий время до события. Проблема в следующем:
1. Когда остаётся 0 часов /дней /минут /секунд, скрипт выводит нулевое значение (пример 0дней 0 часов 3 минуты),
2. Если время до точки отсчёта закончилось, скрипт всё равно будет выводить отсчёт времени "в минус" (пример: -1 undefined 2 часа 3 минуты), и только после обновления страницы покажет в месте счётчика текст "Событие состоялось".
Если есть люди, разбирающиеся в JS, прошу помочь исправить скрипт.

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?  $currenttime = time();
  2.  
  3. /* конечная точка отсчёта в моём варианте берётся из бд. формат datetime, для проверки скрипта можно пользать строку  $share_main['share_endtime']="2010-12-29 12:12:00"; */
  4.  
  5.    $date_time_string = $share_main['share_endtime'];
  6.    $dt_elements = explode(' ',$date_time_string);
  7.    $date_elements = explode('-',$dt_elements[0]);
  8.    $time_elements =  explode(':',$dt_elements[1]);
  9.         $newtime= mktime($time_elements[0], $time_elements[1],$time_elements[2], $date_elements[1],$date_elements[2], $date_elements[0]);
  10.    $secs=floor(($newtime-time()));
  11.         if ($secs<=0) {
  12.         echo "<script type='text/javascript'>
  13.         function Go() {
  14.   document.getElementById('anons_time').innerHTML='<span style=font-size:11pt; font-weight:bold;><b>&nbsp;&nbsp;&nbsp;Событие состоялось</b></span>';
  15.   document.getElementById('join').innerHTML='';
  16.                         }
  17.         setInterval('Go()');
  18.         </script>";
  19.         }
  20.         else {
  21.                 echo "<script type='text/javascript'>
  22.                 time_diff =".$secs.";
  23.                 function countDown() {      
  24.           work_number = time_diff--;
  25.           days = Math.floor(work_number / 86400);      
  26.           work_number -= days * 86400;
  27.           hours = Math.floor(work_number / 3600);
  28.           work_number -= hours * 3600;
  29.           minutes = Math.floor(work_number / 60);
  30.           work_number -= minutes * 60;
  31.           seconds = Math.floor(work_number % 60);
  32.           values = [
  33.              declOfNum(days, ['день', 'дня', 'дней']),
  34.              declOfNum(hours, ['час', 'часа', 'часов']),
  35.              declOfNum(minutes, ['минута', 'минуты', 'минут']),
  36.              declOfNum(seconds, ['секунда', 'секунды', 'секунд'])
  37.           ];
  38.           document.getElementById('anons_time').innerHTML =  values.join('');      
  39.        }
  40.        function declOfNum(number, titles) {
  41.           cases = [2, 0, 1, 1, 1, 2];
  42.           return '<span style=font-size:11pt; font-weight:bold><b>' + number + '</b></span> ' + titles[ (number%100>4 && number%100<20)? 2 : cases[Math.min(number%10, 5)] ];
  43.        }
  44.                 setInterval('countDown()', 1000);
  45.                 </script>";
  46.         }
  47. ?>


На случай, если кому-то пригодится, пример вставки счётчика в страницу

CODE (htmlphp):
скопировать код в буфер обмена
  1. <? require_once("countdown.php"); ?>
  2. <html>
  3. <head>
  4. <title>Отсчёт времени до события</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
  6. </head>
  7. <body>
  8. <div id="anons_time"></div>
  9. </body>
  10. </html>

(Отредактировано автором: 24 Декабря, 2010 - 14:03:26)

 
 Top
JustUserR
Отправлено: 24 Декабря, 2010 - 14:21:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Zuldek Для осуществления внедрения предполагаемой вами функциональности в приведенный JS-скрипт необходимо произвести добавление дополнительных условий текущего состояния времени - в частности если некоторая указанная величина равна нулю и все элементы времени предствяющие большие составляющие последовательно равны нулю - то указання часть целевой строки в левую сторону может быт отсечена - а для проверки отрицательного времени достаточно использования сравнения разности timespamp-объектов Кроме того в качестве дополнительного условия коррекции JS-скрипта - целесообразно использование локальных переменных в функциях заместо включей глобального ассоциативного массива


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Zuldek
Отправлено: 24 Декабря, 2010 - 14:32:18
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




JustUserR пишет:
Zuldek Для осуществления внедрения предполагаемой вами функциональности в приведенный JS-скрипт необходимо произвести добавление дополнительных условий текущего состояния времени - в частности если некоторая указанная величина равна нулю и все элементы времени предствяющие большие составляющие последовательно равны нулю - то указання часть целевой строки в левую сторону может быт отсечена - а для проверки отрицательного времени достаточно использования сравнения разности timespamp-объектов Кроме того в качестве дополнительного условия коррекции JS-скрипта - целесообразно использование локальных переменных в функциях заместо включей глобального ассоциативного массива

Спасибо, в общем-то и было понятно что необходима дополнительная проверка по таймауту выполнения основной фугкции вывода счётчика, равен ли отдин из параметров 0, если равен, то выводить "".. вопрос именно в синтаксическом оформлении этого в JS.
в JS просто не силён, и сколько правил, вставляя условные выражения, не получалось Огорчение
 
 Top
JustUserR
Отправлено: 24 Декабря, 2010 - 14:50:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Zuldek пишет:
Спасибо, в общем-то и было понятно что необходима дополнительная проверка по таймауту выполнения основной фугкции вывода счётчика, равен ли отдин из параметров 0, если равен, то выводить "".. вопрос именно в синтаксическом оформлении этого в JS. в JS просто не силён, и сколько правил, вставляя условные выражения, не получалось
Пожалуйста! В качестве модифицированного варината предполагаемого вами JS-скрипта осуществляющего требуемые элементы отсчета времени - возможно использование следующего листинга
CODE (text):
скопировать код в буфер обмена
  1. window.countDows=function() {
  2. var work_number = window.time_diff--;
  3. if(work_number<1) {window.setTimeout("Go()",30); return;}
  4. else {}
  5. var days = Math.floor(work_number / 86400);
  6. work_number -= days * 86400;
  7. var hours = Math.floor(work_number / 3600);
  8. work_number -= hours * 3600;
  9. var minutes = Math.floor(work_number / 60);
  10. work_number -= minutes * 60;
  11. var seconds = Math.floor(work_number % 60);
  12. var values = [
  13. declOfNum(days, ['день', 'дня', 'дней']),
  14. declOfNum(hours, ['час', 'часа', 'часов']),
  15. declOfNum(minutes, ['минута', 'минуты', 'минут']),
  16. declOfNum(seconds, ['секунда', 'секунды', 'секунд'])
  17. ];
  18. if(days==0) {values[0]="";} else {}
  19. if(hours==0) {values[1]="";} else {}
  20. if(minutes==0) {values[2]="";} else {}
  21. if(seconds==0) {values[3]="";} else {}
  22.  document.getElementById('anons_time').innerHTML = values.join('');
  23. }


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Zuldek
Отправлено: 25 Декабря, 2010 - 18:58:38
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Прошу прощение, что с задержкой. Just большое спасибо, немного поправил скрипт в сторону твоего листинга и получилось сделать то что хотел. Разве что один неприятный момент, функция Get(), которая выводит текст в случае "ухода" времени в отрицательное значение вызывается по твоему листингу, как и у меня, в теле функции CountDown, которая выполняется в моём коде по Settimeout 1000 мc, (у тебя, - CountDows() ).
Причём у неё (функция Get() ) стоит Settimeout выполнения (в твоём листинге 30 мс). Вот из-за этих двух условий и таймаутов получается что текст выводимый Get(), как бы "мигает" (функция постоянно выполняется).
Я правильно понимаю, что требуется условие проверки значения времени и вызов Get() до вызова функции CountDown () ?
 
 Top
Фортис
Отправлено: 25 Декабря, 2010 - 23:04:42
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




я бы, вообще говоря, сделал отдельно запуск события и отдельно отсчет.
CODE (javascript):
скопировать код в буфер обмена
  1. var withTimeout = setTimeout(function () {тут можно вызвать то, что должно произойти}, 100)


хотя иногда использую и такой:
CODE (javascript):
скопировать код в буфер обмена
  1. var startTime;
  2. var outPlace = document.getElementById('timer');
  3. function setTimer(firstEntry)
  4. {
  5.     if (firstEntry == 1) startTime = new Date();
  6.  
  7.     var nowTime  = new Date();
  8.     var timeDiff = startTime.getTime() + /*необходимое время в мс*/ 10000 - nowTime.getTime();
  9.  
  10.     if (timeDiff > 1000)
  11.     {
  12.         var restTime = new Date(timeDiff);
  13.         if(restTime.getUTCMinutes() < 10) {var min = '0'+restTime.getUTCMinutes()} else {var min = restTime.getUTCMinutes()}
  14.         if(restTime.getUTCSeconds() < 10) {var sec = '0'+restTime.getUTCSeconds()} else {var sec = restTime.getUTCSeconds()}
  15.         outPlace.innerHTML = "Осталось: "+min+":"+sec;
  16.         setTimeout("setTimer(0)",500);
  17.     }
  18.     else
  19.         тут можно вызвать то, что должно произойти
  20. }

(Отредактировано автором: 25 Декабря, 2010 - 23:05:52)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB