Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ...и снова Countdown--> (https://javascript.ru/forum/misc/46875-i-snova-countdown.html)

Spirit_on 27.04.2014 20:27

...и снова Countdown-->
 
Здравствуйте уважаемые знатоки скриптоманы!
Частенько заходил сюда просто как гость,почитать,посмотреть.
Но как говорится нужда приспичила,пришлось региться:).
Если с html и css я еще кое-как в состоянии разобраться,то вот Ява-скриптах я полный ахтунг.
К делу:
В нете набрел на сриптик таймера,разобрался как там дату поставить,облагородил его css,но только потом заметил,что он (таймер) не запоминается браузером.При обновлении вкладки отсчет начинается с начала,а хотелось бы,чтобы он продлжался дальше.
Читал я тут у вас,что нужен Set Cookie,но что это и куда...короч труба дело-выручайте!
Вот сам код:
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   <title>Демо</title>
    <script type='text/javascript' src='http://code.jquery.com/jquery-2.1.0.min.js'></script>
       <style type='text/css'>
       </style>
   <script type='text/javascript'>//<![CDATA[ 
$(window).load(function(){
function getTargetDate(hour_to_count){
    var t = new Date();
    var year = t.getFullYear();
    var month = t.getMonth();
    var day = t.getDate();
    var hour = t.getHours()+hour_to_count;
    return new Date(year, month, day, hour).getTime();
}

$(document).ready(function(){
//Время меняем тут:
var hour_to_count = 7; //  отсчет от 7ми часов
// если поставить так: var hour_to_count =2* 24; //  отсчет будет от 2х суток
 
 var target_date = getTargetDate(hour_to_count);
// update the tag with id "countdown" every 1 second
setInterval(function () {
 
// variables for time units
var days, hours, minutes, seconds;
 
// get tag element
var countdown = document.getElementById("countdown");

	var d = document.getElementById("day");
	var h = document.getElementById("hour");
	var m = document.getElementById("minute");
	var s = document.getElementById("second");

    // find the amount of "seconds" between now and target
    var current_date = new Date().getTime();
    
    if(current_date >= target_date){
        target_date = getTargetDate(hour_to_count);
    }
    
    var seconds_left = (target_date - current_date) / 1000;
 
    // do some time calculations
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
     
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
     
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
     
	if(days < 10){
        days = "0" + days;
    }
	if(hours < 10){
        hours = "0" + hours;
    }
    if(minutes < 10){
        minutes = "0" + minutes;
    }
    if(seconds < 10){
        seconds = "0" + seconds;
    }

    d.innerHTML = days;
    h.innerHTML = hours;
    m.innerHTML = minutes;
    s.innerHTML = seconds;

    // format countdown string + set tag value
    //countdown.innerHTML = days + "d, " + hours + "h, "
    //+ minutes + "m, " + seconds + "s";  

}, 1000);

})
});//]]>  

</script>
</head>
 <body>
  <div id="countdown">
     <span id="day" >00</span>
         <span id="hour" >00</span>
         <span id="minute" >00</span>
     <span id="second" >00</span>
  </div> 
 </body>
</html>

P.S
Не пинайте сразу,но хотелось бы именно с этим кодом разобраться,я под него уже css "заточил".
Заранее спасибо за помощь!

рони 27.04.2014 22:47

Spirit_on,
таймер должен отсчитать до определённого времени или заложенные изначально часы?

Spirit_on 27.04.2014 23:14

Цитата:

Сообщение от рони (Сообщение 309543)
Spirit_on,
таймер должен отсчитать до определённого времени или заложенные изначально часы?

Заложенные.
В приведенном коде он от 7ми часов считает,и так бесконечно.Вот еще бы сделать чтобы браузерные куки его запоминали и продолжали отсчет,если даже я через час вкладку открою.
А сейчас все печально сбрасывается на начало,т.е. опять отсчет прет от 7ми часов.
Я себе уже все мозги свихнул,пол инета облазил-но в скриптах полный дилетант.

рони 27.04.2014 23:59

Spirit_on,
время указать в секундах ... для примера поставлено 30сек
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   <title>Демо</title>
    <script type='text/javascript' src='http://code.jquery.com/jquery-2.1.0.min.js'></script>
       <style type='text/css'>
       </style>
   <script>
$(window).load(function(){
function getTargetDate(Milliseconds_to_count){
    var t = new Date();
    t.setMilliseconds(t.getMilliseconds()+Milliseconds_to_count)
    return t.getTime();
}

//Время меняем тут:

 var Milliseconds_to_count = 30 * 1000; //  отсчет в секундах - 7 часов = 7 * 60 * 60 * 1000
 var time = 200
 var target_date = getTargetDate(JSON.parse(localStorage.getItem("Milliseconds"))|| Milliseconds_to_count);

// update the tag with id "countdown" every 1 second
var timer = function () {

// variables for time units
var days, hours, minutes, seconds;

// get tag element
var countdown = document.getElementById("countdown");

	var d = document.getElementById("day");
	var h = document.getElementById("hour");
	var m = document.getElementById("minute");
	var s = document.getElementById("second");

    // find the amount of "seconds" between now and target
    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date);
    localStorage.setItem("Milliseconds", JSON.stringify(seconds_left));

    if(seconds_left < 1000){
        target_date = getTargetDate(Milliseconds_to_count);
        time = 1000;
    }
    seconds_left /= 1000;
    // do some time calculations
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;

    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;

    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);

	if(days < 10){
        days = "0" + days;
    }
	if(hours < 10){
        hours = "0" + hours;
    }
    if(minutes < 10){
        minutes = "0" + minutes;
    }
    if(seconds < 10){
        seconds = "0" + seconds;
    }

    d.innerHTML = days;
    h.innerHTML = hours;
    m.innerHTML = minutes;
    s.innerHTML = seconds;
    window.setTimeout(timer, time)
};
 timer()


});

</script>
</head>
 <body>
  <div id="countdown">
     <span id="day" >00</span>
     <span id="hour" >00</span>
     <span id="minute" >00</span>
     <span id="second" >00</span>
  </div>
 </body>
</html>

Spirit_on 28.04.2014 03:07

Цитата:

Сообщение от рони (Сообщение 309549)
Spirit_on,
время указать в секундах ... для примера поставлено 30сек

Снимаю шляпу,Рони :thanks: .
То,что надо.
Но есть некоторые затыки,не пойму на браузер грешить или в коде что-то.?
Проверял в Хроме,Опере,Мазиле
1.Проглатывает цифры (перескакивает напр.с 9ки сразу на 7ку,или с 3ки на 1цу).
2.В Мазиле и Опере по окончании отсчета и новом начале отсчета,в нулях которые стоят в самом начале цифры появляются,и сразу пропадают.
Или с воспроизведением флеша у меня косяки или в коде что-то допилить надо.
Да,Рони у меня в коде на 84ой строке стояла вот такая загогулина //]]> .
В твоем коде ее нет,она нужна вообще?
Да вот ссылка на видео,как таймер у меня косячит..
http://www.youtube.com/watch?v=PXUt7...ature=youtu.be
И можно еще вопрос?
Сколько "живут" эти куки?

рони 28.04.2014 09:23

Spirit_on,
1. и 2. так устроен этот скрипт можно попробовать уменьшить 1000 в строке 79 но и это не решит проблему до конца.
и ещё добавить +1 в строке 45
localStorage.setItem("seconds", JSON.stringify(seconds_left+1));



строки 84 и 9 лишнее
Объект localStorage хранит данные без ограничения по времени
видео посмотреть не смог ))) пароль требует

Spirit_on 28.04.2014 10:18

Цитата:

Сообщение от рони (Сообщение 309575)
Spirit_on,
1. и 2. так устроен этот скрипт можно попробовать уменьшить 1000 в строке 79 но и это не решит проблему до конца.
и ещё добавить +1 в строке 45
localStorage.setItem("seconds", JSON.stringify(seconds_left+1));



строки 84 и 9 лишнее
Объект localStorage хранит данные без ограничения по времени
видео посмотреть не смог ))) пароль требует

Спасибо Рони за наводки!
Поправил ссылку на видео.
Только вариант с уменьшением 1000 сразу отметается,я ставлю 999 и таймер косячить начинает,если секунд мало выставлено-незаметно,а если от 4х дней к примеру,то должно быть так! 03:59:59:59,а он показыв.:04:00:05:23
Не в той строке поменял.
А вот что дает +1 в 45й строке?
В Хроме все идеально,а вот с Оперой и Мазилой подтормаживания,про ИЕ вообще молчу,там только нули статикой стоят на месте .
Жаль конечно,что он как то в раскоряк работает,но тебе огромное спасибо все равно-за помощь!

jsnb 28.04.2014 11:13

Цитата:

Сообщение от Spirit_on (Сообщение 309580)
Только вариант с уменьшением 1000 сразу отметается,я ставлю 999 и таймер косячить начинает,если секунд мало выставлено-незаметно,а если от 4х дней к примеру,то должно быть так! 03:59:59:59,а он показыв.:04:00:05:23

Вы точно в той строке 1000 меняете?

Spirit_on 28.04.2014 11:29

Цитата:

Сообщение от jsnb (Сообщение 309587)
Вы точно в той строке 1000 меняете?

На 44ой строке.
Или надо на 79ой?
Вообще ппц,я нуб-нубом.

jsnb 28.04.2014 11:41

Цитата:

Сообщение от Spirit_on (Сообщение 309588)
На 44ой строке.
Или надо на 79ой?
Вообще ппц,я нуб-нубом.

Ну так рони же писал где менять...
Цитата:

Сообщение от рони (Сообщение 309575)
можно попробовать уменьшить 1000 в строке 79


Spirit_on 28.04.2014 12:12

Цитата:

Сообщение от jsnb (Сообщение 309590)
Ну так рони же писал где менять...

Точно,моя невнимательность.Спасибо,ч то носом ткнул:).Не выспался.:) Поменял на 79ой,сижу пялюсь на счетчик.
Пока "полет" вроде нормальный.

Spirit_on 03.05.2014 12:31

Рони ,не посмотришь как время будет?
Есть код,все работает,все зациклено,но не знаю как туда css привязать.
CSS там внизу есть,но с его помощью только весь массив регулируется.
1.Можно ли сделать чтобы число дней было 2х значное (сейчас 1о значное)?
2.Как привязать css к каждой цифре(каждому нулю) и к каждой точке между цифрами.?
Стили не надо прописывать,я это сам сделаю,мне бы сделать,чтоб я зацепиться смог за код.
От ранее обсуждаемого счетчика все таки пришлось отказаться-глотает цифры,печально.
Вот код:
http://jsfiddle.net/B67f4/

рони 03.05.2014 14:09

Цитата:

Сообщение от Spirit_on
От ранее обсуждаемого счетчика все таки пришлось отказаться-глотает цифры,печально.

посмотрите обновлённую версию в 4 посте

Spirit_on 03.05.2014 15:56

Цитата:

Сообщение от рони (Сообщение 310207)
посмотрите обновлённую версию в 4 посте

Посмотрел,глюк с "проглатыванием" прошел,но наблюдается при окончании отсчета секунд резкий переход с 30й на 29ю секунду,но все равно спасибо большое.

Spirit_on 04.05.2014 15:46

Рони,а вот из этого кода,можно как-нибудь хотя бы точки между цифрами убрать и спереди еще 1 ноль (к дням) приделать,если с нулем долго возиться,хотя бы точки поубирать.?
Я пробовал над ними колдовать,но у меня не получилось нифига.

рони 04.05.2014 16:40

Spirit_on,
:-?
http://jsfiddle.net/B67f4/3/

Spirit_on 04.05.2014 17:20

Цитата:

Сообщение от рони (Сообщение 310360)

Да ты волшебник-спасибо!
Завидую по доброму,что вот так запросто со скриптами у тебя на ура!!

рони 04.05.2014 17:59

Spirit_on,
вот тут волшебный сундучок http://learn.javascript.ru/ :victory:

Spirit_on 08.05.2014 00:39

Рони,засада! :help:
Последний код не работает на хостинге.
Пустая белая страница,а на компе все как положено шевелится и работает.
Седня на хост залил и офигел..
Что это может быть?

рони 08.05.2014 00:43

Spirit_on,
мне погадать или как ?

Spirit_on 08.05.2014 00:46

вот
Я тупо код скопировал и залил.

рони 08.05.2014 01:01

Spirit_on,
у вас весь текст идёт практически одной строкой как вы так копируите что из 70 строк у вас получилось три ?

рони 08.05.2014 01:04

попробуйте скопировать отсюда может больше повезёт.
<html>
<head>
 <style type="text/css">
 .number{
   background: #F54500;
 }

  </style>
<script type = "text/javascript">

var cday;
var timeInSecs;
var ticker;

function getSeconds() {
var now = new Date();
var nowtime= now.getTime();  // время теперь в миллисекундах
var countdowntime = new Date(now.getFullYear(),now.getMonth(),now.getDate(),0,0,0); //16 часов = 16:00
//countdowntime - изменяют гд времени, mm, ss к любому времени, требуемому, например, 7,50,0 (0750)

var dy = 5 ; // В пятницу (день 5) - изменяются в течение других дней 0-6
var atime = countdowntime.getTime();
var diff = parseInt((atime - nowtime)/1000);  // положительный, если дата находится в будущем
if (diff >0) {
cday = dy - now.getDay();      
}
else {
cday =  dy - now.getDay() -1;
}
if (cday < 0) { cday += 7; }   // провел время обратного отсчета, поэтому пойдите в течение следующей недели
if (diff <= 0) { diff += (24*60*60 ) }    // время ковыряем тут (сейчас сутки)
startTimer (diff);
}

function startTimer(secs) {
timeInSecs = parseInt(secs);
ticker = setInterval("tick()",1000); 
tick(); //начать встречный показ сразу же
}

function tick() {
var secs = timeInSecs;
if (secs>0)   { 
timeInSecs--; 
} 
else { 
clearInterval(ticker); // прекратите считать в ноле
getSeconds();  // и начните снова и снова!
 }

var days = Math.floor(secs/86400);
secs %= 3600;   // попробовать поиграть в этой строке (было 86400)
var hours= Math.floor(secs/3600);
secs %= 3600;
var mins = Math.floor(secs/60);
secs %= 60;
var result = ((days < 10 ) ? "0":"" )+days+' ';
result += ((hours < 10 ) ? "0":"" ) + hours + " " + ( (mins < 10) ? "0" : "" ) + mins
+ " " + ( (secs < 10) ? "0":"" ) + secs + "";
    document.getElementById("countdown").innerHTML =  result.replace(/(\d+)/g, "<span class='number'>$1</span>");
}
</script>
</head>
<body onload = "getSeconds()" style="background-color: #ffffff;">
<div id="CountD" style="background-color: #ffffff; width:300px; height: 180px; background-image:url(ScreenShot002.png) ">
			<span id="title" style="font-family: arial; font-size: 20; font-weight: bold; color: #ffffff; position: relative; top:27px; left:60px; z-index:1;">Weekend Cup 2012</span>
			<br><br>
			<span id="countdown" style="font-family: arial; font-size: 25; font-weight: bold; color: #3b3b3b; position: relative; top:34px; left:127px; z-index:1;"> </span>			
</div>		
</body>
</html>

Spirit_on 08.05.2014 01:11

Цитата:

Сообщение от рони
у вас весь текст идёт практически одной строкой как вы так копируите что из 70 строк у вас получилось три ?

Да это хост такой код выдает.В нотпаде все как положено.
Ща попробую-обязательно отпишусь.

Spirit_on 08.05.2014 01:17

Цитата:

Сообщение от Spirit_on (Сообщение 310816)
Да это хост такой код выдает.В нотпаде все как положено.
Ща попробую-обязательно отпишусь.

Перезалил-результат тот же.Сам не пойму в чем дело.
Хотя 1й код,кот мы обсуждали в начале на этом же хосте-все работает.
А вот этот ни в какую.

рони 08.05.2014 01:45

Spirit_on,
Кодировать в UTF-8 без BOM -- а у вас просто UTF-8

Spirit_on 08.05.2014 01:56

Неа-бесполезно.И кодировал и преобразовывал без бом и прост в utf-8.
Все тоже самое.Во капец какой закрался.

рони 08.05.2014 02:07

Spirit_on,
может к php?

Spirit_on 08.05.2014 02:13

Цитата:

Сообщение от рони (Сообщение 310823)
Spirit_on,
может к php?

Не понял вопроса.
Я на всякий уже расширение менял на php.
Все также-без изменений.

Spirit_on 10.05.2014 23:17

Рони,никаких мыслей не появилось?
---->

рони 10.05.2014 23:20

Spirit_on,
проблемы не со скриптами -- вам нужен специалист либо по php либо по тем программам которые вы используите

Spirit_on 10.05.2014 23:22

Цитата:

Сообщение от рони (Сообщение 311304)
Spirit_on,
проблемы не со скриптами -- вам нужен специалист либо по php либо по тем программам которые вы используите

А что именно с php,программ не использую никаких.
Если можно чуть подробней,чтоб представлять где копать?

рони 10.05.2014 23:25

Spirit_on,
сервер значит у вас сам по себе работает и нужную информацию сам для себя вставляет :-/

Spirit_on 10.05.2014 23:27

Цитата:

Сообщение от рони (Сообщение 311308)
Spirit_on,
сервер значит у вас сам по себе работает и нужную информацию сам для себя вставляет :-/

Все спасибо,не буду больше доставать(раздражать..)
p.s.
Решил трабл,пришлось в скрипте поубирать комментирования после двойного слеша // на русском языке
----------------------------------------
Еше раз сорри за беспокойство.


Часовой пояс GMT +3, время: 10:21.