#help Таймер обратного отсчета и куки
Есть счетчик обратного отсчета для сайта, счетчик привязан к кукам, но работает не совсем корректно.
Нужно сделать так, что бы пользователю при входе на сайт давалось 2 часа, таймер отсчитал 2 часа и остановился. Сейчас это реализовано следующим образом: function sendtss() { var v = new Date(); $.post('/mailer/stat.php',{timeon:(v.getTime()-parseInt($.cookie('eggo_vst')))}, function(){/*setTimeout(sendtss, 1000);*/}); } $(document).ready(function(){ setInterval(sendtss, 2000); if (jQuery.cookie) { var d=new Date(); $.cookie('eggo_vst', d.getTime(), {path:'/', expires:2}); } if (typeof window.eggo_countdown_options != 'undefined') { window.eggo_countdown_options.end_time = new Date(2014, 3, 13, 5, 0, 0); $(window.eggo_countdown_options.selector).eggoCountdown(window.eggo_countdown_options); } Собственно вопрос, как сделать что бы каждому зашедшему пользователю давалось по 2 часа времени, и счетчик не начинал крутиться с самого начала? Полный код счетчика /* * вёрстка должны быть вида: <div class="countdown"> <div class="hours">00</div> <div class="mins">00</div> <div class="secs">00</div> </div> <div class="countdown-subs"> <div class="hours">часов</div> <div class="mins">минут</div> <div class="secs">секунд</div> </div> использование: $('.countdown').eggoCountdown(options); где options это объект(ассоц.массив) со следующими возможными ключами: end_time:new Date(year, month, day), -- дата окончания отсчёта. помним, что месяцы нумеруются с НУЛЯ! То есть январь=0, август=7! selector:'.countdown', -- селектор для вписывания счётчика. совпадает с тем селектором, на который вызван метод eggoCountdown. with_days:false, нужно ли отображать дни. если false, то только часы, минуты и секунды. subtitles_selector:'.cd-st-wrp', селектор для вывода подписей под днями, часами, минутами и секундами (словами). если текстовые подписи не нужны -- указывать false. format_str:'<div class="hour">%h%</div><div class="min">%m%</div><div class="sec">%s%</div>', строка для вывода html внутри контейнера(ов) по селектору selector. %d% --дни, %h% --часы, %m% -минуты %s% --секунды subtitles:'<div class="desc h">%h%</div><div class="desc m">%m%</div><div class="desc s">%s%</div>', --аналогично строка для подстановки подписей к счётчику. если не используются подписи, то можно не указывать. */ (function( $ ){ options={ selector:false, with_days:false, with_seconds:true, format_str:'', subtitles:'', end_time:new Date }, _default={ selector:'.countdown', with_days:false, with_seconds:true, format_str:'<div class="h">%h%</div><div class="m">%m%</div><div class="s">%s%</div>', subtitles_selector:'.countdown-titles', subtitles:'<div class="sub-h">%h%</div><div class="sub-m">%m%</div><div class="sub-s">%s%</div>', end_time:new Date('+1day') }, /* массив методов данного модуля. */ methods = { /** инициализация всего функционала */ init : function( _options ) { options = $.extend(_default, _options); this.data('eggoCountdown', this.options); var timeout = 0; if (options.with_seconds) { timeout = 1000; } else { timeout = 60000; } setInterval(methods.timerHandler, timeout); }, /*ведущий ноль*/ __leadingZero:function(val) { if (parseInt(val) < 10) { return val = '0'+val; } else { return val; } }, __declension:function(val, variants) { val = parseInt(val) % 100; if (val%10 ==1 && (val < 10 || val > 20)) { return variants[0]; } else if( val % 10 == 0 || val%10 > 4 ||(val > 10 && val < 20) ) { return variants[2]; } else { return variants[1]; } }, timerHandler:function(){ var now=new Date(); var today_y=now.getYear(); if (today_y < 1000) { today_y += 1900; } delta = options.end_time - now; if(delta >= 0) { dday = Math.floor(delta/(60*60*1000*24)*1); dhour = Math.floor((delta%(60*60*1000*24))/(60*60*1000)*1); dmin = Math.floor(((delta%(60*60*1000*24))%(60*60*1000))/(60*1000)*1); dsec = Math.floor((((delta%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1); } else { dday = dhour = dmin = dsec = 0; } var fmt = options.format_str; if(options.with_days == false) { dhour += dday*24; } fmt = fmt.replace('%d%', ''+methods.__leadingZero(dday)); fmt = fmt.replace('%h%', ''+methods.__leadingZero(dhour)); fmt = fmt.replace('%m%', ''+methods.__leadingZero(dmin)); fmt = fmt.replace('%s%', ''+methods.__leadingZero(dsec)); $(options.selector).html(fmt); if (options.subtitles_selector.length > 0) { fmt = options.subtitles; fmt = fmt.replace('%d%', methods.__declension(dday, ['день','дня','дней'])) fmt = fmt.replace('%h%', methods.__declension(dhour,['час','часа','часов'])) fmt = fmt.replace('%m%', methods.__declension(dmin,['минута','минуты','минут'])) fmt = fmt.replace('%s%', methods.__declension(dsec,['секунда','секунды','секунд'])); $(options.subtitles_selector).html(fmt); } }, /** нас попросили удалиться. отвяжем все наши события от соотв. блоков. */ destroy:function(){ }, }; /* добавляемся в jQuery,чтобы можно было работать аналогично любому её плагину, при этом не засоряя пространство имён $.fn вызовы функций этого плагина будут делаться в виде $(selector).eggoCountdown('methodname' [, arg1 [,arg2...]]); */ $.fn.eggoCountdown = function( method ) { // логика вызова метода if ( methods[method] ) { return methods[ method ].apply(this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method "' + method + '" is not implemented in eggoCountdown' ); } }; })( jQuery ); jQuery.cookie=function(b,j,m){if(typeof j!="undefined"){m=m||{};if(j===null){j="";m.expires=-1}var e="";if(m.expires&&(typeof m.expires=="number"||m.expires.toUTCString)){var f;if(typeof m.expires=="number"){f=new Date();f.setTime(f.getTime()+(m.expires*24*60*60*1000))}else{f=m.expires}e="; expires="+f.toUTCString()}var l=m.path?"; path="+(m.path):"";var g=m.domain?"; domain="+(m.domain):"";var a=m.secure?"; secure":"";document.cookie=[b,"=",encodeURIComponent(j),e,l,g,a].join("")}else{var d=null;if(document.cookie&&document.cookie!=""){var k=document.cookie.split(";");for(var h=0;h<k.length;h++){var c=jQuery.trim(k[h]);if(c.substring(0,b.length+1)==(b+"=")){d=decodeURIComponent(c.substring(b.length+1));break}}}return d}}; function sendtss() { var v = new Date(); $.post('/mailer/stat.php',{timeon:(v.getTime()-parseInt($.cookie('eggo_vst')))}, function(){/*setTimeout(sendtss, 1000);*/}); } $(document).ready(function(){ setInterval(sendtss, 2000); if (jQuery.cookie) { var d=new Date(); $.cookie('eggo_vst', d.getTime(), {path:'/', expires:2}); } if (typeof window.eggo_countdown_options != 'undefined') { window.eggo_countdown_options.end_time = new Date(2014, 3, 13, 5, 0, 0); $(window.eggo_countdown_options.selector).eggoCountdown(window.eggo_countdown_options); } $('.ActionText').html(''); var prmstr = window.location.search.substr(1); var prmarr = prmstr.split ("&"); if (!window.ph_inited) { if ($.Placeholder) { $.Placeholder.init(); } } if ($.fn.colorbox) { $('a[href^="/agreement"]').colorbox({maxHeight:'90%'}); } $('body').append('<div id="fadeshadow" style="position:fixed;width:100%; height:100%;left:0;top:0; background:black;z-index:1000;opacity:0.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);display:none;"></div>'); for ( var i = 0; i < prmarr.length; i++) { var tmparr = prmarr[i].split("="); if(tmparr[0] == 'success') { if (jQuery.cookie('offset_data')) { $("body, html").scrollTop(jQuery.cookie('offset_data')); } $('#fadeshadow').css({'filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=50)'}).show(); $('#thanks, .thanks').show().css({'z-index':10000, opacity:1,'filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=100)'}); $('.button-close,.thanks input[type=button],.thanks a, .thanks .close').click( function(){ $('#thanks, .thanks').hide(); $('#fadeshadow').hide(); }); break; } } if ($.colorbox) { $('.cbox,.colorbox').colorbox({scalePhotos:true,maxHeight:'90%'}); } $('form').each(function(){ if ($(this).find('input[name=form_id]').length < 1) { if ($(this).attr('id')) { $(this).append('<input type="hidden" name="form_id" value="'+$(this).attr('id')+'">'); } else { $(this).append('<input type="hidden" name="form_id" value="form-'+$('form').index(this)+'">'); } } }); }); |
Часовой пояс GMT +3, время: 08:48. |