2013-10-02 3 views
1

Хелло, я делаю приложение для викторины и хочу установить таймер. Я хочу сделать это в Javascript. Это моя функция:Предотвращение остановки таймера при неактивном окне Javascript

function countDown(sec, elem) { 
    _(elem).innerHTML = sec; 
    if(sec < 1) { 
     clearTimeout(timer); 
     endGame(); 
     return; 
    } 
    sec--; 
    var timer = setTimeout('countDown('+sec+',"'+elem+'")',1000); 
} 

Проблема заключается в том, что, например, для мобильного браузера Саффарей, когда вы держите палец на экране (например, прокрутку эффекта), таймер останавливается, но вы все еще можете увидеть вопросы ... Итак, в принципе, вы можете иметь неограниченное время. Как я могу заставить таймер запускать нотатер?

Спасибо заранее!

+0

Самый безопасный способ: дважды проверить время на стороне сервера. Другой способ: сохранить время начала в переменной JS и проверить время отправки. –

+0

thats, что я думал, но может быть, есть защищенный способ сделать это в Javascript ... – user2840278

+0

Javascript однопоточный. Если он занят в ответ на событие, он не может запускать обработчики таймера. – Barmar

ответ

1

Вы не можете сделать время «независимо от того, что» - Mobile Safari не будет запускать вызовы setTimeout и setInterval во время сенсорных событий. Фактически, до iOS6 события полностью отбрасываются.

Вы должны вместо этого проверить работоспособность с помощью конструктора даты и выполнить проверку на стороне сервера. Если кто-то действительно хочет обмануть, они могут, в конце концов, изменить ваш JavaScript на клиенте.

+0

ОК, это имеет смысл, спасибо – user2840278

0

Вы всегда можете проверить Date всякий раз, когда происходит событие таймера. Что-то вроде:

var timerStart = function(timeLimit) { 
    var remaining = timeLimit, h, m, s; 
    var startTime = +new Date();/*Date.now();*/ 

    var instance = function() { 
     if (remaining > 0) { 
      remaining = timeLimit - ((+new Date()) - startTime); 
      h = Math.floor(remaining/3600000); 
      m = Math.floor(remaining % 3600000/60000); 
      s = Math.floor(remaining % 3600000 % 60000/1000); 
      window.setTimeout(instance, 1000); 
     } else { 
      /* do whatever you need to do when time is up */ 
     } 
    } 

    instance(); 
} 
Смежные вопросы