Непрерывный таймер

Тема в разделе "Другие языки", создана пользователем Rigor, 30 авг 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    Нужен таймер на яваскрипт, чтобы даже после закрытия окна он работал. Я так понимаю, надо в куки последнее значение записать, потом после нового открытия окна вычислить сколько прошло и продолжать тикать с этого момента. Но как это реализовать? Заранее спасибо.
     
  2. qwerty

    qwerty Постоялец

    Регистр.:
    10 апр 2006
    Сообщения:
    75
    Симпатии:
    0
    Интересует точно такой же вопрос. так что новый пост плодить не буду только со своей стороны хотелось бы его немного расширить.а именно.

    если передовать значение скажем через параметр пхп скрипта или как раз сохранять в кукисах будет ли это безопасно? тоесть его можно будет подправить в передаче параметар или отредактировать кукисы.

    тоесть если например таймер используется для скачки ну обошли и обошли. а вот если он используется в играх то это уже будет чит. каким образом это в играх реализуют?
     
  3. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    731
    Симпатии:
    421
    Если я правильно понял, то вот навоял быстренько простой примерчик. Суть будет ясна, а там эксперементируйте на свой вкус.

    HTML:
    
    <html>
    <head><title>Пример</title> 
    </head> 
    <body> 
    <script language="JavaScript">
    <!--
    startday = new Date();
    clockStart = startday.getTime();
    
    function initStopwatch(){ 
     var myTime = new Date(); 
     var timeNow = myTime.getTime(); 
     var timeDiff = timeNow - clockStart; 
    
     this.diffSecs = timeDiff/1000; 
     return(this.diffSecs); 
    } 
    
    function getSecs(){ 
     var mySecs = initStopwatch(); 
     var mySecs1 = ""+mySecs; 
    
     // mySecs1= mySecs1.substring(0,mySecs1.indexOf(".")) + " сек."; 
     mySecs1= mySecs1.substring(0,mySecs1.indexOf(".")); 
     document.forms[0].timespent.value = mySecs1 
     window.setTimeout('getSecs()',1000); 
    }
    
    //Чтение cookie-данных записи
    function readCookie(name)   
    {
      var xname = name + "=";
      var xlen = xname.length;
      var clen = document.cookie.length;
      var i = 0;
      while(i < clen)
      {
        var  j = i + xlen;
        if (document.cookie.substring(i, j) == xname) 
          return  getCookieVal(j);
        i = document.cookie.indexOf(" ",1) + 1;
        if (i == 0) break;
      }
      return null;
    }
    
    // Вспомогательная  функция, вызываемая  из readCookie()
    function getCookieVal(n)
    {
      var endstr = document.cookie.indexOf(";", n);
      if (endstr == -1)
        endstr = document.cookie.length;
      return unescape(document.cookie.substring(n,endstr));
    }
    
    function addCookie(szName,szValue,dtDaysExpires){ // имя, значение, время жизни в днях
    	var dtExpires = new Date(); // назначаем объект Date
    	var dtExpiryDate = "";
    
    	// через сколько удалить куки
    	dtExpires.setTime(dtExpires.getTime() + dtDaysExpires * 24 * 60 * 60 * 1000);
    	// выставляем дату в строку
    	dtExpiryDate = dtExpires.toGMTString();
    	// загоняем в переменные значения в куки
    	document.cookie = szName + "=" + szValue + "; expires=" + dtExpiryDate;
    }
    
    function WriteTime(){ 
    	var MyTime = readCookie("mytime");
    	var mIT = document.getElementById('myIsTime');
    
    	if (MyTime == null) { MyTime2 = Number(mIT.value); }
    	else { MyTime2 = Number(MyTime) + Number(mIT.value); }
    
    	addCookie("mytime", MyTime2.toString(), 10);
    	alert("MyTime2: " + MyTime2.toString() + " - #" + MyTime.toString() + "#");
    
    }
    //-->
    </script>
    </head>
    <body onLoad="window.setTimeout('getSecs()',1)" onUnload="WriteTime()">
    <CENTER><font size=+1>Таймер</font></CENTER>
    <CENTER><form>Время нахождения:<input name="timespent" id="myIsTime" size="9" type="text"></form>
    </body> 
    </html>
    
     
  4. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    Это не то. При обновлении страницы счетчик обнуляется, а мне нужно чтобы он тикал с того места, где был до обновления
     
  5. qwerty

    qwerty Постоялец

    Регистр.:
    10 апр 2006
    Сообщения:
    75
    Симпатии:
    0
    Rigor не знаю для каких тебе целей и какие тебе технологии нужно использовать и можно.Но лично для себя я надумал следующее.Мне нужно что бы счетчик был безопасный и его значение изменить пользователем было нельзя. но он тоже должне быть виден на нескольких страницах один и тот же. Выхода кроме как хранить основное время на сервере я не нашел.и ответов пока других не поступило.может быть тебе стоит завести таблицу. скажем timer и там два поля id и stamp и time.
    в stamp будет хранитсья время сколько осталось дотикать
    id это идетнификатор таймера лучше что бы это было рендомное боооольшое число и его нельзя было угодать
    и time собственно сколько вообще должен быть таймер.
    и когда переходишь на страницу у тебя быдет параметр скрипту передоваться id и будет там айди таймера.а скрипт будет в поле stamp писть сколько времени осталось дотикать.

    з.ы.поле time наверное даже и не нужно совсем.
     
  6. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Явно не получится. Дело в ограничении языка ява.
    1. Ты пишеш таймер который тикает когда отрыта страница (Фича по его остановке: нажимается правой кнопкой мишки закрыть броузер и не отпуская кнопку овести курсор мышки)
    2. Пишеш в куки (чистятся куки легко в любом броузере)


    ОСтается только один вариант писать время на сервер.
     
  7. qwerty

    qwerty Постоялец

    Регистр.:
    10 апр 2006
    Сообщения:
    75
    Симпатии:
    0
    unsiker а есть метод сохранения и считывания времени на сервере без передачи идентификатора таймера скрипту как я описал выше?
     
  8. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    731
    Симпатии:
    421
    код же можно дописать!
    в куки пишется какое состояние счетчика, так при лоаде снимай куку и вставляй в форму со старым значением. В чем проблема?
     
  9. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Если юзер в системе всего 1, то индификатор можно не передавать. Если юзеров больше чем 1, то нужно их как то индефицировать. Либо выдавать ему индефикатор, либо логин пароль.
     
  10. juggernaut13

    juggernaut13 Постоялец

    Регистр.:
    23 авг 2009
    Сообщения:
    59
    Симпатии:
    16
    зачем сервер
    сохраняеш в куке время старта таймера ну и каждую секунду (период) в куке обновляеш сколько натикало

    а после переоткрытия страницы
    сравниваеш даты что хранится в куке с тем сколько сейчас времени у пользователя
    получаеш разницу и добавляеш к таймеру в куке(отнимаеш)
    запускаеш таймер
     
Статус темы:
Закрыта.