Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.04.2014, 13:46
Новичок на форуме
Отправить личное сообщение для poroxprod Посмотреть профиль Найти все сообщения от poroxprod
 
Регистрация: 11.04.2014
Сообщений: 1

#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)+'">');
        }
    }
    });
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикленный таймер обратного отсчета levshaszr Элементы интерфейса 7 12.10.2014 22:20
таймер обратного отсчета в формате (H, m, s) mozgs Общие вопросы Javascript 1 22.12.2013 13:46
Таймер обратного отсчета на Alert moorzilla Общие вопросы Javascript 2 27.05.2012 21:14
Графический таймер обратного отсчета bobri4 Элементы интерфейса 4 24.08.2009 21:50
таймер обратного отсчета Mignon Общие вопросы Javascript 1 07.06.2008 16:16