obj.onmouseover=function(){}和obj.onmouseover=change() 的区别

来源:9-22 编程练习

MuYi0420

2016-03-17 18:02


我在回答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>


写回答 关注

3回答

  • 限量
    2016-03-25 14:33:11

    前面的同学看来并没有认真看问题啊,答非所问。

    这里我发表一下我的看法。

    先抛出答案: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类似。


    qq_bru...

    鼠标停留在对象上时触发一个函数操作(function).

    2016-09-07 10:50:14

    共 2 条回复 >

  • Kitayama
    2016-03-22 00:19:51

    全局变量和局部变量的区别,你参数给了obj,把参数删了 加一个for循环tr元素就可以了

  • 慕雪芸茗
    2016-03-17 18:43:02

    差不多,,看你的习惯了,function(){}是临时的匿名函数,,只能在这个地方调用,,其他地方想调用还得重新定义!

    MuYi04...

    额,我的意识是我这个代码里边。。为啥有一个可以用有一个不可用。。。他们俩貌似还是有点区别。。。

    2016-03-17 18:53:55

    共 1 条回复 >

JavaScript进阶篇

本课程从如何插入JS代码开始,带您进入网页动态交互世界

468061 学习 · 21891 问题

查看课程

相似问题