В конечном счете, вы не можете доверять пользовательскому вводу. Без учета времени, прошедшего на сервере, нет никакой гарантии, что данные не были обработаны.
Однако, если вы уверены, что ваши тестеры не разбираются в JavaScript и просто полагаются на «хитрость», которую они где-то нашли, вы можете проверить на мошенничество (паузу) с помощью следующего кода, который не Не требуется изменять window.alert:
var timer = {
startDatetime: null,
startSec: 0,
variance: 1,
exitOnPause: true,
count: function (config) {
var that = this;
if (typeof config == "object" && typeof parseInt(config.seconds) == "number" && !isNaN(parseInt(config.seconds)))
{
if (typeof parseFloat(config.variance) == "number" && !isNaN(parseFloat(config.variance))) this.variance = config.variance;
if (typeof config.exitOnPause == "boolean") this.exitOnPause = config.exitOnPause;
if (config.seconds > 0)
{
if (!this.startSec) this.startSec = config.seconds;
if (!this.startDatetime) this.startDatetime = new Date();
var currentDatetime = new Date();
if (currentDatetime.getTime() - this.startDatetime.getTime() > (this.startSec - config.seconds) * this.variance * 1000)
{
if (typeof config.onPause == "function") config.onPause();
if (!this.exitOnPause)
{
this.startDatetime = new Date();
this.startSec = config.seconds--;
window.setTimeout(function () { that.count(config); }, 1000);
}
}
else
{
config.seconds--;
window.setTimeout(function () { that.count(config); }, 1000);
}
}
else
{
if (typeof config.onFinish == "function") config.onFinish();
}
}
}
};
Этот объект таймера имеет единственный метод count (), который принимает объект в качестве входных данных. Ожидается как минимум свойство секунд во входном объекте.
По какой-то причине window.setTimeout не всегда работает должным образом. Иногда на моем компьютере window.setTimeout (x, 1000), который должен выполнить код через 1 секунду, занимал более 2 секунд. Таким образом, в таком случае вы должны допустить отклонение, чтобы люди, которые не обманывают, не отмечались как мошенники. Дисперсия по умолчанию равна 1, но она может быть переопределена во входном объекте. Вот пример того, как использовать этот код, который дает 2,5 секунды «комнаты для маневра» для медленных ударов:
timer.count({
seconds: 10,
onPause: function () { alert("You cheated!"); window.location.replace("cheatersAreBad.html"); },
onFinish: function () { alert("Time's up!"); },
variance: 2.5
});
С таким решением вы могли бы использовать Ajax, чтобы сообщить серверному скрипту, что пользователь приостановил таймер, или перенаправить пользователя на страницу, объясняющую, например, что его поймали на мошенничестве. Если по какой-то причине вы хотите, чтобы пользователь продолжил принимать участие в опросе после того, как его поймали на мошенничестве, вы можете установить для exitOnPause значение false:
timer.count({
seconds: 10,
exitOnPause: false,
onPause: function () { recordCheaterViaAjax(); },
onFinish: function () { alert("Time's up!"); },
variance: 2.5
});