事件的代理委托原理、优缺点。自定义事件

2018-02-28  本文已影响0人  Creator93
靠的事件的冒泡机制实现的
优点:
          1、可以大量节省内存的使用,减少注册事件,例如给table中的td事件,就添加到table上
          2、实现新增子对象时无需再次对其绑定事件。对于动态部分尤为适合
缺点:
          仅是上述1中类似的需求才会使用,使用场景比较少。
  function delegateEvent(interfaceEle,selector,type,fn){
        if(interfaceEle.addEventListener){
            interfaceEle.addEventListener(type.eventfn,false);
        }else{
            interfaceEle.attachEvent(type,eventfn);
        }

        function eventfn(e){
            var e = event || window.event;
            var target = e.target || e.srcElement;
            if(matchSelector(target,selector)){
                if(fn){
                    fn.call(target,e);
                }
            }
        }

        function matchSelector(ele,selector){
            if(selector.charAt(0) == "#"){
                  return ele.id == selector.slice(1);
            }
            if(selector.charAt(0) == "."){
                  return (""+ele.className+"").indexOf(""+ selector.slice(1)+"") != -1;
            }
            return ele.tagName.toLowerCase() == selector.slice(1).toLowerCase();
        }
  }

DOM自定义事件

不是由DOM触发的,它的目的是让开发人员创建自己的事件。
触发事件分别为dispatchEvent()和fireEvent()--IE

调用 createEvent("CustomEvent");
返回对象有一个名为initCustomEvent(),接受四个参数

       type(字符串):触发的事件类型,例如“keydown”
       bubbles(布尔值):表示事件是否应该冒泡
       cancelable(布尔值):表示事件是否可以取消
       detail(对象):任意值,保存在event对象的detail属性中。

例如:

    var div = document.getElementById("myDiv"),event;
    EventUtil.addHandler(div,"myevent",function(event){
        
    })
    
    if(document.implement.hasFeature("CustomEvents","3.0")){
        event = document.createEvent("CustomEvent");
        event.initCustomEvent("myevent",true,false,"Hello world!");
        //触发
        div.dispatchEvent(event);
    }
  

IE中模拟事件
document.createEventObject() 不接受参数
fireEvent()接受两个参数,事件处理程序的名称和event对象。在调用fireEvent()方法的时候回自动为event对象添加SRCElement和type属性。其他属性则手动添加。

    var div = document.getElementById("myDiv");
    var event = document.createEventObject();
    event.screenX = 100;
    event.screenY = 100;
    event.clientX = 100;
    event.clientY = 100;
    event.ctrlKey = false;
    event.altKey = false;
    event.shiftKey = false;
    event.button = 0;

//触发
    div.fireEvent("onclick",event);
上一篇下一篇

猜你喜欢

热点阅读