为了账号安全,请及时绑定邮箱和手机立即绑定

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


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

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

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

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


1 回复 有任何疑惑可以回复我~
#1

慕姐8289045

能问一下吗?obj.onmouseover=function(){}是什么意思?定义一个方法时不是function加方法名吗?这个都没有方法名,这是啥意思?
2016-07-26 回复 有任何疑惑可以回复我~
#2

qq_brucelee_13817038

鼠标停留在对象上时触发一个函数操作(function).
2016-09-07 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

MuYi0420 提问者

额,我的意识是我这个代码里边。。为啥有一个可以用有一个不可用。。。他们俩貌似还是有点区别。。。
2016-03-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript进阶篇
  • 参与学习       468060    人
  • 解答问题       21891    个

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

进入课程

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信