js事件探秘-学习笔记

18 Sep 2014


1、事件流:事件冒泡、事件捕获
2、使用事件处理程序的方法:
  • HTML事件处理程序:

    直接添加在html文件中;

    如:< input onclick="clickName()">

    缺点:html和js代码紧密的耦合在一起;

  • DOM0级事件处理程序:

    把一个函数赋值给一个事件的处理程序属性

              < input type="button" value="点击我" id="inputBtn">
    
              var inputBtn = document.getElementById('inputBtn');
              inputBtn.onclick = function(){
                alert('hello world!');
              };
              inputBtn.onclick = null;//删除事件
            

    优势:用的比较多,简单,跨浏览器;可以给一个元素添加多个事件处理程序;

  • DOM2级事件处理程序:

    DOM2级事件定义了两个方法:用于处理指定和删除事件处理程序的操作

    addEventListener()和 removeEventListener();

    接收三个参数:要处理的事件名、作为事件处理程序的函数和布尔值;//true:表示在捕获阶段调用事件处理程序,false:表示在冒泡阶段调用事件处理程序

    input.addEventListener(‘click’, function(){alert('hello')}, false);

  • ie事件处理程序:

    attachEvent()添加事件、detachEvent()删除事件

    接收相同的两个参数:事件处理程序的名称和事件处理程序的函数

    input.attachEvent(‘onclick’, function(){alert('hello')});

  • 跨浏览器事件处理程序:
            var eventUtil = {
              //添加句柄
              addHandler: function(element, type, handler){
                if(element.addEventListener){
                  element.addEventListener(type, handler, false);
                }else if(element.attachEvent){
                  element.attachEvent('on' + type, handler);
                }else{
                  element['on' + type] = handler;
                }
              },
              //删除句柄
              removeHandler: function(element, type, handler){
                if(element.removeEventListener){
                  element.removeEventListener(type, handler, false);
                }else if(element.detachEvent){
                  element.detachEvent('on' + type, handler);
                }else{
                  element['on' + type] = null;
                }
              },
              getEvent: function(event){
                return event ? event : window.event;
              },
              getType: functon(event){
                return event.type;
              },
              getElement: function(event){
                return event.target || event.srcElement;
              },
              preventDefault: function(event){
                if(event.preventDefault){
                  event.preventDefault();
                }else{
                  event.returnValue = false;
                }
              },
              stopPropagation: function(event){
                if(event.stopPropagation){
                  event.stopPropagation();
                }else{
                  event.cancelBubble = true;
                }
              }
            };
    
            eventUtil.addHandler(btn1, 'click', function(e){
              //doing something
              e=eventUtil.getEvent(e);
              eventUtil.preventDefault(e);
              eventUtil.stopPropagation(e);
            });
    
            
            
            go
            
3、事件对象:
  • 在触发DOM上的事件时都会产生一个对象

    事件对象event

    DOM中的事件对象:

    type属性-用于获取事件类型;

    target属性-用户获取事件目标;

    stopPropagation()方法-用于阻止事件冒泡;

    preventDefault()方法-用于阻止事件的默认行为;

    IE中的事件对象:

    type属性-用于获取事件类型;

    srcElement属性-用于获取事件目标;(var ele = event.target || event.srcElement;)(event = event || window.event;//ie8之前引用的是window.event)

    cancelBubble属性-用于阻止事件冒泡;(设为true表示阻止冒泡,设为false表示不阻止事件冒泡;)

    returnValue属性-用于阻止事件的默认行为(设置为false为阻止);

4、不同的事件类型:
  • 鼠标事件:

    click、mouseover、mouse out…

    键盘事件