#javascript #jquery #timer
#javascript #jquery #таймер
Вопрос:
По сути, я разрабатываю приложение для викторины с ограниченным временем. Use выбирает ответ на вопрос, и следующий вопрос загружается с помощью Ajax-запроса. Ответы на все вопросы должны быть даны в течение, скажем, 2 минут.
Часы отсчитывают время, показывая, сколько времени осталось, и как только оно достигает 0, отображаются результаты. Теперь, поскольку таймер будет реализован с использованием window.setTimeout()
, возможно, что значение timer variable
будет изменено с помощью внешнего букмарклета или чего-то подобного. В любом случае, я могу это предотвратить? Я думаю, что это реализовано на сайтах обмена файлами, таких как megaupload. Любая подделка переменной timer приводит к отклонению запроса на файл.
Ответ №1:
.setTimeout()
Вызовите метод AJAX на вашем сервере для синхронизации времени. Не полагайтесь на время клиента. Вы также можете сохранить время начала теста на сервере, а затем проверить время окончания при публикации теста.
Комментарии:
1. В первом было бы слишком много запросов ajax. Довольно пустая трата пропускной способности. Не так ли? Второй вариант кажется хорошим. С нетерпением буду ждать его реализации.
Ответ №2:
Вам нужно добавить проверку на стороне вашего сервера. Когда клиент хочет загрузить следующий вопрос с помощью Ajax-запроса, проверьте, наступил ли крайний срок.
Таймер на стороне клиента js — это просто уровень присутствия.
Ответ №3:
Если функция выполняется как выражение функции, вызываемое немедленно, то глобальных переменных нет, и локальному скрипту нечего ниспровергать. Конечно, ничто не мешает пользователю прочитать ваш код и сформулировать подделку, но все, что связано с javascript, открыто для таких атак.
Как говорили другие, используйте сервер для проверки запросов на основе часов, не полагайтесь на него, чтобы что-то гарантировать. Вот простой обратный отсчет, который работает с момента начала, поэтому попытки быстрого выполнения не будут работать. Глобальных переменных для сброса или изменения также нет.
например
(function (){
// Place to write count down
var el = document.getElementById('secondsLeft');
var starttime,
timeout,
limit = 20; // Timelimit in seconds
// Function to run about every second
function nextTick() {
var d = new Date();
// Set start time the first time
if (!starttime) starttime = d.getTime();
var diff = d.getTime() - starttime;
// Only run for period
if (diff < (limit * 1000)) {
el.innerHTML = limit - (diff/1000 | 0);
} else {
// Time's up
el.innerHTML = 0;
clearTimeout(timeout);
}
}
// Kick it off
timeout = window.setInterval(nextTick, 1000);
}());