btn是一个按钮的节点名,那么btn.onclick="createa()";为什么不能再点击按钮时调用creata()函数呢?
// btn.onclick="createa()";
btn.setAttribute("onclick", "createa()");
这两行代码为什么不是等价的?但是第二行代码测试可行!
// btn.onclick="createa()";
btn.setAttribute("onclick", "createa()");
这两行代码为什么不是等价的?但是第二行代码测试可行!
2015-08-09
只能来自问自答了:
js是事件驱动的,一个节点可以发生很多种事件,包括click事件。在js中,当节点发生某一个事件时,可以为该事件绑定一个处理函数。也就是类似的
var btn=document.getElementById("myBtn")
btn.onclick = function(){createa(url,text)}
所要注意的是,这个节点的onclick属性(有人争议这是个事件,我也觉得应该是个事件),需要赋给一个函数类型的值(或者说应该给它绑定一个函数),才可以处理事件。
但是createa()并不是一个函数,你可以说你定义了一个名叫createa的函数,但createa()【也就是加了一对括号的createa】,是函数执行了之后的结果,createa()是等价于createa这个函数的返回值的。在createa函数里,只是给body内添加了一个a标签,并没有返回值,所以默认的结果就是undefined,也就是说非要给createa()确定一个值的话,把它打印出来就会显示undefined。
那么如果写成
btn.onclick =createa();
实际上是等价于
btn.onclick = undefined;
显然undefined是不能作为节点事件的处理函数的。
但是,也不是一定要加上function(){},你可以写成这样:
btn.onclick =createa;
虽然createa()不是函数,但createa却是函数,是可以作为节点事件的处理函数的,但是又因为这里定义的createa函数是需要两个参数的,所以直接调用的话,会造成函数没有参数传入,产生undefined的结果,还在考虑ing,有兴趣的同学可以回复我一起试验。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head>
<body>
<script type="text/javascript">
var main = document.body;
//创建链接
function createa(url,text)
{
var a=document.createElement("a");
a.innerHTML=text;
a.href=url
a.style.color="red";
main.appendChild(a);
// window.open("http://www.imooc.com","_blank")
}
// 调用函数创建链接
var btn = document.createElement("input");
btn.type="button";
btn.value="显示慕课网链接";
// var url="http://www.imooc.com";
//text="慕课网";
//btn.onclick=createa(url,text);
btn.onclick=createa('http://www.imooc.com','慕课网');
// btn.setAttribute("onclick", "createa('http://www.imooc.com','慕课网')");
btn.style.backgroundColor="red";
main.appendChild(btn);
</script>
</body>
</html>举报