我在回答http://www.imooc.com/code/1636的时候,碰到一个问题
在下面的自定义函数bgchange中,如果我调用change函数,则默认给出的前俩行的背景颜色不会改变,而自己添加的背景颜色可以改变;
如果我在后边直接function(){function body},则都可以改变,不知道这是为什么?
求解答!
<!DOCTYPE html> <html> <head> <title> new document </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script type="text/javascript"> // function mouseEvent(){ // var trs= document.getElementsByTagName("tr"); // for (var i=0;i<trs.length;i++){ // trs[i].setAttribute("onmouseover","change(this)"); // trs[i].setAttribute("onmouseout","back(this)"); // } // // } function change(ev){ ev.style.backgroundColor="#f2f2f2"; } function back(ev){ ev.style.backgroundColor="#fff"; } function removeEvent(){ var as= document.getElementsByTagName("a"); for (var i=0;i<as.length;i++){ as[i].setAttribute("onclick","deleteraw(this)"); } } function bgchange(obj){ #这里为什么=change(obj)不可以,而=function(){}就可以? obj.onmouseover = change(obj);//function(){ obj.style.backgroundColor="#f2f2f2"; }; obj.onmouseout = back(obj); //function(){ obj.style.backgroundColor="#fff" }; } window.onload = function(){ // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。 //mouseEvent(); removeEvent(); var trs=document.getElementsByTagName("tr"); for(var i=0;i<trs.length;i++){ bgchange(trs[i]); } } // 编写一个函数,供添加按钮调用,动态在表格的最后一行添加子节点; function add(){ var table=document.getElementById("table"); var newtr=document.createElement("tr"); newtr.setAttribute("onmouseover","change(this)"); newtr.setAttribute("onmouseout","back(this)"); var newtd1=document.createElement("td"); var newtd2=document.createElement("td"); var newtd3=document.createElement("td"); newtd1.innerHTML="XX"; newtd2.innerHTML="YY"; var newa=document.createElement("a"); newa.href="javascript:;" newa.setAttribute("onclick","deleteraw(this)"); newa.innerHTML="删除"; table.appendChild(newtr); newtr.appendChild(newtd1); newtr.appendChild(newtd2); newtr.appendChild(newtd3); newtd3.appendChild(newa); } // 创建删除函数 function deleteraw(ev){ var pa =ev.parentNode.parentNode.parentNode; pa.removeChild(ev.parentNode.parentNode); } </script> </head> <body> <table border="1" width="50%" id="table"> <tr> <th>学号</th> <th>姓名</th> <th>操作</th> </tr> <tr> <td>xh001</td> <td>王小明</td> <td><a href="javascript:;" >删除</a></td> <!--在删除按钮上添加点击事件 --> </tr> <tr> <td>xh002</td> <td>刘小芳</td> <td><a href="javascript:;" >删除</a></td> <!--在删除按钮上添加点击事件 --> </tr> </table> <input type="button" value="添加一行" onclick="add()"/> <!--在添加按钮上添加点击事件 --> </body> </html>
前面的同学看来并没有认真看问题啊,答非所问。
这里我发表一下我的看法。
先抛出答案:obj.onmouseover=function(){};是固定用法。
这里我先解释一下obj.onmouseover=change();为什么一定不可以。我们先假设这句代码成立,那么此时obj.onmouseover就被赋予了change()函数的返回值。现在看看你的change()函数有return语句吗?显然没有吧?那obj.onmouseover的值是什么呢?ㄟ( ▔, ▔ )ㄏ 鬼知道。
然后我们来看下为什么说加粗的那句代码是固定用法呢?首先你得明白对象有属性和方法。
比如:
var person=new Object();//先定义一个空对象。 person.name="小明";//定义对象的属性。 person.showName=function(){ alert("我叫"+this.name); };//定义对象的方法。
那么obj是一个元素节点,也是一个对象。那么onmouseover事件的触发总要进行一些操作吧?那么对象的属性和方法那个能进行一些操作呢?那就是方法啦。
所以onmouseover是obj的一个方法,定义的方法和showName类似。
全局变量和局部变量的区别,你参数给了obj,把参数删了 加一个for循环tr元素就可以了
差不多,,看你的习惯了,function(){}是临时的匿名函数,,只能在这个地方调用,,其他地方想调用还得重新定义!