while(true) { //0以外の数値でもよい
...
if(condition) break;
...
}
for(variable in object) {
...
}
で object に含まれる全てのプロパティについて処理を行うことができます。
var prop, obj;
obj = document.anchors;
for(prop in obj) {
//"length"以外の時(配列の添字の時)に表示
//いつの間にかこのifはいらなくなった
if(prop != "length")
alert(obj[prop].name);
}
ボタンを押すと、このページの全てのアンカーの名前が順に表示されます。
var a = new Array(10);
a[7] = 2;
a[5] = 1;
for(i in a)
alert(i);
7、5 の順に表示されます。やっぱりハッシュ法を使っているのでしょうか
(もうちょっと詳しくは、こちら)。
with(form.text1) {
value = value + "a";
}
これは、
form.text1.value = form.text1.value + "a";
と同じです。すなわち、
with(object) {
...
}
とすると、 object を省くことができます。
var strhoe = "ほえほえほえほえほえほえほえ";
var unitlength = "ほ".length;
var hoelength = strhoe.length;
function test4() { setTimeout("scroll_hoe()", 300); }
function scroll_hoe() {
document.form1.text1.value = strhoe;
//先頭の1文字を末尾に
strhoe = strhoe.substring(unitlength, hoelength)
+ strhoe.substring(0, unitlength);
setTimeout("scroll_hoe()", 300);
}
一見すると再帰的に呼び出しているようですが、そうではありません。
setTimeout(expression, millisec);
で、いったんサブルーチンの最後まで処理を行ない、
それから millisec ミリ秒待って、 expression を評価します。
function test5() {
//1が表示されてから2が表示される
//すなわち下の行のほうが最初に実行される
setTimeout("document.form2.text1.value = 2", 3000);
document.form2.text1.value = 1;
}
このように setTimeout
を使うと無限に処理を繰り返すことができるわけですが、
これを止めるには clearTimeout を使います。
var strhoe2 = "ほえほえほえほえほえほえほえ";
var Timer_id;
var isscrolling = false; //最初は動いてない
function test6() {
if(isscrolling) //動いているとき
clearTimeout(Timer_id); //止める
else //止まっているとき
Timer_id = setTimeout("scroll_hoe2()", 300);
isscrolling = !isscrolling;
}
function scroll_hoe2() {
document.form3.text1.value = strhoe2;
strhoe2 = strhoe2.substring(unitlength, hoelength)
+ strhoe2.substring(0, unitlength);
Timer_id = setTimeout("scroll_hoe2()", 300);
}
ボタンを押すと開始し、再びボタンを押すと止まります。
clearTimeout(Timer_id);
と setTimeout の返り値を引数にすることにより、
Timer_id = setTimeout(expression, millisec);
の expression の評価をキャンセルします。
function test7() {
var a = "1"; //ローカル変数
setTimeout("window.status = a", 2000);
}
ボタンを押すと2秒後にエラーが発生します。