码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript学习笔记(四)——js事件之事件绑定、兼容问题

时间:2015-12-27 21:59:36      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:

事件捕获:事件从根节点开始,逐级到子节点,若节点绑定了事件动作,则执行动作,继续往下走。
事件冒泡:事件由子节点向跟节点派送,若节点绑定了事件动作,则执行动作,然后继续往上走。
 
一、怎么绑定事件和移除事件?
由于IE浏览器不支持事件捕获,只支持事件冒泡。因此,其他遵循标准的浏览器都使用W3C定义的函数绑定和移除,IE浏览器则自有一套执行规则。下面分别总结一下W3C和IE的绑定机制:
1、W3C下的事件绑定
添加事件 — addEventListener()
移除事件 — removeEventListener()
停止事件冒泡 — even.stopPropagation( )
其中包含3个参数:事件名(如click、mouseover-不加on)、函数、冒泡或捕获的布尔值(捕获为true,冒泡为false。一般情况下我们都使用false)
例如:
技术分享

写一个事件切换器:
技术分享
当点击id为“ box”的div时,红色蓝色不断交替。(也可得出,W3C下的事件可以传递this)
 
★总结:
   ①addEventListener( )可以为元素分配多个处理函数,而不是覆盖;  
【如:window.addEventListener(“load”),function(){alert(“Hi”);},false);
           window.addEventListener(“load”),function(){alert(“Goodbye”);},false);
           //会相继弹出 Hi GoodBye.而不会被覆盖】
    ② 相同函数会被屏蔽.
【如:window.addEventListener(“load”,init,false);
           window.addEventListener(“load”,init,false);
           function init(){
           alert(“Hi”);}   //只会弹出一次 Hi】
    ③ 可以传递this ,见上例事件切换器
    ④ 添加一个额外方法,不会被覆盖

2、IE下的事件绑定
添加事件 — attachEvent( )
移除事件 — detachEvent( )
停止事件冒泡 — window.event.cancelBubble = true;
由于IE不支持捕获,则只需2个参数:事件名(要加on)、函数名    
例如:
技术分享
★总结:
① IE下事件绑定可以解决覆盖问题,顺序会颠倒,如上例
② 相同函数不会被屏蔽,如上例
③ 无法传递this。
【例:window.attachEvent(“unload”,function( ){
           var box = document.getElementById(“box”);
            box.attachEvent(“onclick”,function(){
            alert(this ===window);   //得到true,不能传递this
           }});】
④ 添加额外方法,不会被覆盖
【例:window.attachEvent(“onload”,function(){
           var box = document.getElementById(“box”);
           box.attachEvent(“onclick”,function(){
           alert(“Hi”);
         });
          box.attachEvent(“onclick”,function( ){
          alert(“Hello”);
         }); 
       });//依次弹出 Hi , Hello】

? 二、W3C和IE的全套兼容
1、跨浏览器添加事件:
//obj相当于window,type相当于load, fn相当于function
技术分享
2、跨浏览器移除事件:
技术分享
3、跨浏览器获取目标对象:
技术分享

事件对象的其他补充:
1、W3C下,在mouseover和mouseout事件中,获取从哪里移入、移出的DOM对象,用relatedTarget属性
IE下,移入用fromElement,移出用toElement
 
例:兼容代码:
function getTarget(evt){
 var e = evt || window.event;
if (e.srcElement){                       //  IE下
   if (e.type = =“mouseover”){
   return e.fromElement;
} else if (e.type = =“mouseout”){
  return e.toElement;
} else if(e.relatedTarget){              //  W3C下
 return e.relatedTarget;
  }
 } 
}
 
2、阻止默认行为(例:阻止打开超链接)
W3C下采用 preventDefault( )方法;
IE下采用 returnValue = false 方法;
 
例:代码兼容:
function preDef(evt){
 var e = evt || window.event;
if(e.preventDefault){
  e.preventDefault( );
}else {
  e.returnValue = false;
}
}
 
 3、上下文菜单事件:用contextmenu事件来修改右击出现指定的菜单。
 
例:function preDef(evt){
       var  e = evt||window.event;
          if(e.preventDefault){
             e.preventDefault();
           }else {
             e.returnValue=false;
           }
        }
 
     addEvent(window,“load”,function(){
         var text = document.getElementById(“text”);
         addEvent(text,"contextmenu",function(evt){
         preDef(evt);                                      //阻止菜单弹出
         var menu = document.getElementById(“menu”);
         var e = evt || window.event;
         menu.style.left = e.clientX+”px”;      //右击菜单随鼠标出现
         menu.style.top = e.clientY+”px”;  
         menu.style.display = “block”;          // 弹出修改后的菜单
 
     addEvent(document,”click”,function(){
         menu.style.display  = “none”;           //不显示默认的菜单框
})
})
})
 
      

JavaScript学习笔记(四)——js事件之事件绑定、兼容问题

标签:

原文地址:http://www.cnblogs.com/emory/p/5080781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!