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


    事件捕获:事件从根节点开始,逐级到子节点,若节点绑定了事件动作,则执行动作,继续往下走。
    事件冒泡:事件由子节点向跟节点派送,若节点绑定了事件动作,则执行动作,然后继续往上走。
     
    一、怎么绑定事件和移除事件?
    由于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”;           //不显示默认的菜单框
    })
    })
    })
     
          
  • 相关阅读:
    DevExpress_Winform_使用汇总
    SVN的可视化日志统计工具StatSVN
    jenkins搭建.Net项目自动构建
    关闭tab时,定位到导航栏对应的激活tab
    DevExpress.XtraNavBar.NavBarControl 模拟单击导航的选项事件
    选中Tab控件单击事件,点击tab头,定位到导航栏的选项,为选中状态 ,DevExpress.XtraNavBar.NavBarControl 导航控件定位或选中状态 另导航的选项为选中状态.
    WCF服务部署到IIS问题汇总
    iOS多线程编程
    最新版SDWebImage的使用
    前端入门系列之CSS
  • 原文地址:https://www.cnblogs.com/emory/p/5080781.html
Copyright © 2020-2023  润新知