这是我的片段。
$(function() {
setCountDown(0, 1, 0);
a = Array();
$(window).bind('beforeunload', function() {
if (a['endTime']) {
return ("You are in the middle of a test");
}
});
});
function setCountDown(hours, minutes, seconds) {
$(".timer").removeClass("common_displayNone");
timerInterval = setInterval(
function() {
if (hours.toString().length == 1) {
hours = "0" + hours;
}
if (minutes.toString().length == 1) {
minutes = "0" + minutes;
}
if (seconds.toString().length == 1) {
seconds = "0" + seconds;
}
if (seconds > 0) {
seconds--;
if (seconds.toString().length == 1) {
seconds = "0" + seconds;
}
} else if (seconds == 0 && (minutes > 0)) {
minutes = minutes - 1;
seconds = 59;
} else if (minutes == 0 && (hours > 0)) {
hours = hours - 1;
minutes = 59;
}
if (hours == 0 && minutes == 0 && seconds == 0) {
clearInterval(timerInterval);
a.removeItem("endTime");
}
$("#timer").html(hours + ":" + minutes + ":" + seconds);
a['endTime'] = (hours * 3600 + minutes * 60 + seconds);
}, 1000);
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="timer"></div>
&#13;
尝试重新加载页面。你会收到警报。在那个警报期间,我的计时器没有运行。所以用户可以作弊测试。如何解决这个问题?
答案 0 :(得分:3)
我担心alert
的工作原理。它阻止了单线程JavaScript运行,等待输入。我建议以其他方式提醒。它不仅是非阻塞的,而且还可以使用CSS对实际的警报框进行样式化。
答案 1 :(得分:2)
Javascript是一种单线程语言,这意味着您无法在&#34; background&#34;上运行代码。当javascript提示警告窗口时,它等待用户点击&#34;确定&#34;。
如果你真的想要弹出窗口,你必须使用HTML和CSS。
如果您担心作弊,我建议您处理用户对其测试服务器端的时间,因为用户仍然可以编辑您的javascript以允许自己花费更多时间。您可以使用websockets或polling完成此操作。
答案 2 :(得分:0)
JavaScript通常被认为只有一个执行线程 脚本(*)可见,这样当你的内联脚本,事件监听器 或输入超时,您将完全控制住您 从块或函数的末尾返回。