先看下面有问题的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多个window.onload方法解决方案</title>
<style type="text/css">
/*为div元素设置CSS样式*/
#div1{border-width: 3px;border-style: double;
border-color: bisque;
font-size: large;
height: 80px;width: 150px;
background-color: cornflowerblue;
text-align: center;}
</style>
<script type="text/javascript">
//克隆div节点,并更改克隆出的div文本内容
window.onload = function () {
var oDiv = document.getElementById("div1");
function copyNode() {
var newDivNode = oDiv.cloneNode();//此处没有参数true
newDivNode.innerHTML = "I was cloned!";
newDivNode.style.backgroundColor = "#FFA500";
var parentNode = oDiv.parentNode;
parentNode.appendChild(newDivNode);
}
oDiv.onclick = copyNode();
}
</script>
</head>
<body>
<div id="div1">I am div1</div>
</body>
</html>
执行代码的结果:
代码执行后,还没有点击div,页面就自动克隆了一个div。而且此时不能够通过点击div克隆更多新的div元素。
具体的底层逻辑是:
oDiv.onclick = copyNode();
在上面这行代码中——
由于copyNode()函数有小括号“()”,所以上面这行代码的含义是"调用"copyNode()函数,而不是“绑定”函数。
因此在oDiv上正确绑定函数的方法是:
oDiv.onclick = copyNode;
第1种改进代码方式:
将原来的:
oDiv.onclick = copyNode();
修改为:
oDiv.onclick = copyNode;
将小括号去掉,就能够使代码正常运行。
此种代码方式的弊端:没有考虑到如果小括号()中需要传递参数的情况。
第2种改进代码方式:
将原来的:
oDiv.onclick = copyNode();
修改为:
oDiv.onclick = function () {
copyNode();
}
先将copyNode();函数放进一个匿名函数中,再将匿名函数通过onclick关键字绑定到oDiv上。
第3种改进代码方式:
<script type="text/javascript">
//克隆div节点,并更改克隆出的div文本内容
window.onload = function () {
var oDiv = document.getElementById("div1");
oDiv.onclick = function () {
var newDivNode = oDiv.cloneNode();//此处没有参数true
newDivNode.innerHTML = "I was cloned!";
newDivNode.style.backgroundColor = "#FFA500";
var parentNode = oDiv.parentNode;
parentNode.appendChild(newDivNode);
}
}
</script>
直接将需要通过onclick关键字绑定到oDiv元素上的方法以匿名函数的形式存在。
这种方式是程序员最常用的。