有人可以帮我这个忙。首先让我提出代码。
HTML:
<div id="FirstChild" style=" background-color: red; width: 100px; height: 50px; margin: 5px;"></div>
JavaScript:
window.onload = someThing;
function someThing(){
window.onclick = WidthChange;
}
function WidthChange(){
var presentWidth = parseInt(document.getElementById("FirstChild").style.width);
document.getElementById("FirstChild").style.width = presentWidth + 1 +"px";
setTimeout(WidthChange(), 3000);
}
现在,我想在用户单击窗口时每隔3秒将div的宽度增加1 px。我希望这永远发生。但它不起作用。当我单击窗口时,宽度立即增加。
我知道如何使用jQuery animate()做到这一点,但我不想使用它。请只使用Javascript!
最佳答案
with会立即增加,因为您没有设置对该函数的超时调用,而是将超时调用设置为该widthchange函数的返回值。将setTimeout(WidthChange(), 3000);
替换为setTimeout(WidthChange, 3000)
。
进行此操作时,请同时考虑执行以下操作:
presentWidth + 1 +"px";
您在这里同时做两件事:将int加在一起和连接字符串。只要明确要先执行的操作即可:
(presentWidth +1) +"px";
或者只是将其分成两个语句。
最后:约定规定以大写字母开头的函数是构造函数,而不仅仅是函数/事件处理程序。所以也许也将
WidthChange
更改为widthChange
吗?更新资料
setTimeout(WidthChange, 3000)
和setTimeout(WidthChange(), 3000)
之间的区别非常简单。 JS将WidthChange()
视为一个表达式,需要将其解析为一个值(如数学运算中的折断)。该表达式调用一个函数,因此可以将其解析为该函数调用的返回值。因此,立即调用该函数,而不是在3000ms之后。在没有括号的版本中,作为第一个参数传递给setTimeout的值是对函数的引用,无法进一步解析/简化。超时到期后,
setTimeout
将调用该函数。如果您不清楚,只需使用Google setTimeout MDN
(和MDN书签)。