var canvas = document.getElementById('jsccanvas');
var context = canvas.getContext('2d');
context.clearRect(0, 0, 640, 400);
var step = 1;
var r, g, b;
var x0, y0, x1, y1;
x0 = 640 * Math.random();
y0 = 400 * Math.random();
while(step <= 500) {
++ step;
drawline();
}
function drawline() {
r = Math.floor(255 * Math.random());
g = Math.floor(255 * Math.random());
b = Math.floor(255 * Math.random());
x1 = 640 * Math.random();
y1 = 400 * Math.random();
context.beginPath();
context.strokeStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.stroke();
x0 = x1;
y0 = y1;
}
実行途中で処理を開放しなかったために、意図した結果が得られない様です。 以下の、ループを実現している処理に、問題がありそうです。
while(step <= 500) {
++ step;
drawline();
}
インターバルタイマを利用して、ループの各ステップが、タイマで呼び出されるようにして、処理を開放します。 こうすることで、ループ処理の途中経過が表示され、長時間ループによる警告も発せられなくなります。
上記プログラムの while ループを以下の様に書き換えます。
jscsetintervalid = setInterval(function() {
if(step >= 500) {
clearInterval(jscsetintervalid);
jscsetintervalid = null;
}
++ step;
drawline();
}, 10);
setInterval の返値である ID を jscsetintervalid に保存すると、本環境では Cls ボタンを押したときに、アニメーションループがキャンセルされます。 本環境の様な機能が実現されてない環境では、アニメーションループは設定したステップ数が終了するまで処理が継続されます。
var canvas = document.getElementById('jsccanvas');
var context = canvas.getContext('2d');
context.clearRect(0, 0, 640, 400);
var step = 1;
var r, g, b;
var x0, y0, x1, y1;
x0 = 640 * Math.random();
y0 = 400 * Math.random();
jscsetintervalid = setInterval(function() {
if(step >= 500) {
clearInterval(jscsetintervalid);
jscsetintervalid = null;
}
++ step;
drawline();
}, 10);
function drawline() {
r = Math.floor(255 * Math.random());
g = Math.floor(255 * Math.random());
b = Math.floor(255 * Math.random());
x1 = 640 * Math.random();
y1 = 400 * Math.random();
context.beginPath();
context.strokeStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.stroke();
x0 = x1;
y0 = y1;
}
ブラウザが備えているアニメーション機能によって、実現します。
こうすることで、ループ処理の途中経過が表示され、長時間ループによる警告も発せられなくなります。
上記プログラムのループを以下の様に書き換えます。
function loop() {
if(step >= 500) {
clearInterval(jscrequestanimationid);
jscrequestanimationid = null;
} else {
jscrequestanimationid = requestAnimationFrame(loop);
}
++ step;
drawline();
}
jscrequestanimationid = requestAnimationFrame(loop);
requestAnimationFrame の返値である ID を jscrequestanimationid に保存すると、本環境では Cls ボタンを押したときに、アニメーションループがキャンセルされます。 本環境の様な機能が実現されてない環境では、アニメーションループは設定したステップ数が終了するまで処理が継続されます。
var canvas = document.getElementById('jsccanvas');
var context = canvas.getContext('2d');
context.clearRect(0, 0, 640, 400);
var step = 1;
var r, g, b;
var x0, y0, x1, y1;
x0 = 640 * Math.random();
y0 = 400 * Math.random();
function loop() {
if(step >= 500) {
clearInterval(jscrequestanimationid);
jscrequestanimationid = null;
} else {
jscrequestanimationid = requestAnimationFrame(loop);
}
++ step;
drawline();
}
jscrequestanimationid = requestAnimationFrame(loop);
function drawline() {
r = Math.floor(255 * Math.random());
g = Math.floor(255 * Math.random());
b = Math.floor(255 * Math.random());
x1 = 640 * Math.random();
y1 = 400 * Math.random();
context.beginPath();
context.strokeStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.stroke();
x0 = x1;
y0 = y1;
}