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>
举报