コードに他にもいくつか問題があることに気付きました。修正点にコメントし、他のヒントもいくつか追加しました。
var seconds = 0;
var clockId;
var correctAns;
// Lets get a reference to the quizclock element and save it in
// a variable named quizclock
var quizclock = document.getElementById('quizclock');
function runClock() {
// seconds + 1;
// This calculates seconds + 1 and then throws it away,
// you need to save it back in to the variable
// You could do that with:
// seconds = seconds + 1;
// But it would be even better with the shorthand:
seconds += 1;
// set the HTML inside of the quizclock element to new time
quizclock.innerHTML = seconds;
}
function startClock() {
showQuiz();
runClock();
// setInterval("runClock()", 1000);
// When using setInterval and setTimeout you generally just
// want to directly pass it the function by name. Passing it
// a string "runClock()" is in effect actually running
// eval("runClock()"), eval should be avoided unless you
// really need it.
// setInterval returns a number which identifies the interval,
// you need to save that number, you'll need it when you
// call clearInterval
clockId = setInterval(runClock, 1000);
}
function stopClock() {
// clearInterval takes the id that setInterval
// returned to clear the interval
clearInterval(clockId);
gradeQuiz();
// you had this alert statment after the return statement,
// it would have never run, return statements end the
// function and anything after them is ignored
alert("You have " + correctAns + " correct out of 5 in " +
quizclock + " seconds.");
//return = correctAns;
// the return statement doesn't need a =,
// return = correctAns says set a variable named return to the
// value of correctAns since return is a reserved word,
// that should generate an error
return correctAns;
}
いくつかの便利な参照リンク:
これが正式なクラスの場合、基本的な DOM メソッドを使用して要素 (getElementById
など) を取得する必要がある場合があります。独学で学習している場合は、DOM ライブラリを学習することをお勧めします。jQueryをお勧めします。習得が容易で、現在では多かれ少なかれ事実上の標準になっています。代わりにjQueryを使用すると、次のdocument.getElementById('quizclock')
ことができます$('#quizclock')
。jQuery を使用すると、コードが少し短くなり、さまざまなブラウザー間で標準化され、それらのブラウザーのバグから保護されます。
あなたはまだ初心者です。このような小さな例では、グローバル変数について心配する必要はありません。ページ上の別の関数で という名前のグローバル変数も使用されている場合はどうなるseconds
でしょうか? 変更seconds
され、タイマーが台無しになる可能性があります。これは少し進んでいますが、これを回避する 1 つの方法は、コードを自己呼び出しの無名関数でラップすることです。
(function () {
var seconds = 0;
// inside here seconds is visible and can be used
}());
// outside seconds is not declared, it will return undefined.
残念ながら、内部の関数も外部には表示されないため、それらを経由してonclick=
アタッチすることはできませんが、DOM を使用してアタッチすることはできます (すべきです):
var submitButton = document.getElementById('submitanswers'); // you'll have to give the button an id
submitButton.addEventListener('click', stopClock, false);
繰り返しますが、jQuery を使用すると、これがさらに簡単になります。
$('#submitanswers').on('click', stopClock);
同様に、jQuery を使用している場合は、変数をグローバル名前空間から除外する関数でコードをラップする必要があります。
$(document).ready(function () {
var seconds;
// again seconds is visible here
});
// but not here