【发布时间】:2013-11-02 14:11:40
【问题描述】:
我是一个非常初学者的网页设计师,我对这段代码有两个问题。
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
#canvas1{border: #666 3px solid;}
</style>
<script type="application/javascript" language="javascript">
function draw (x,y){
var canvas = document.getElementById('canvas1');
var ctx = canvas.getContext('2d');
ctx.save();
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillstyle = "rgb (0,200, 0)";
ctx.fillRect(x, 20, 50, 50);
ctx.restore();
x += 5;
var loop = setTimeout('draw('+x+', '+y+')', 100);
}
</script>
</head>
<body>
<button onclick="draw(0,0)">Start</button>
<canvas id="canvas1" width="400" height="400"</canvas>
</body>
</html>
为什么方块总是变黑?以及为什么如果我再次尝试按开始,clearRect 功能不起作用?
【问题讨论】:
-
从不将字符串传递给
setInterval()或setTimeout()。这样做与使用eval()一样糟糕,一旦使用变量,它就会导致代码不可读且可能不安全,因为您需要将它们插入字符串而不是传递实际变量。正确的解决方案是setInterval(function() { /* your code *) }, msecs);。这同样适用于setTimeout()。如果只想调用单个函数不带任何参数,也可以直接传函数名:setInterval(someFunction, msecs);(注意函数名后面有no()) -
它调用了一个函数,函数draw。
-
你没有明白我的意思。您应该传递一个实际函数:
setTimeout(function() { draw(x, y); }, 100);,或者如果您只需要支持现代浏览器:setTimeout(draw.bind(this, x, y), 100);