深究JavaScript程序员JavaScript 进阶营

事件流and事件处理程序

2017-08-16  本文已影响65人  baiying

事件流

什么是事件流

事件冒泡流

IE的事件流叫做事件冒泡,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点

事件捕获流

Netscape Communicator的事件流是事件捕获流,思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件,事件捕获的用意在于事件到达预定目标之前就捕获它

由于老版本的浏览器不支持,因此很少有人使用事件捕获,建议使用时间冒泡除非有特殊需求

DOM事件流

'DOM2级事件'规定事件流包括三个阶段:事件捕获-处于目标阶段-事件冒泡阶段

事件处理程序

HTML事件处理程序

如下两种调用事件处理程序的方式都是HTML处理程序
<input type="button" onclick = "alert('click')"/>

 <script type = 'text/javascript'>
    function show(){
      alert('click');
    }
  </script>
<input type="button" onclick = 'show()'>
DOM0级事件处理程序
//事件处理程序在元素的局部作用域下运行
var btn = document.getElementById('btn');
btn.onclick = function(){
  alert('click');
}

删除其事件处理程序
btn.onclick = null;

DOM2级事件处理程序
var btn = document.getElementById('btn');
btn.addEventListener('click',handler,false);
function handler(){
  alert('click');
}

btn.removeEventListener('click',handler,false);

DOM2级事件处理程序最大的优点是可以添加多个事件处理程序,会按照添加的先后顺序依次执行

var btn = document.getElementById('btn');
btn.addEventListener('click',handler,false);
btn.addEventListener('click',handler1,false);
function handler(){
  alert('click');
}
function handler1(){
  alert('click1');
}
//会先弹出'click',再弹出'click1'
IE事件处理程序

IE中有类似DOM中的两个方法:

var btn = document.getElementById('btn');
btn.attachEvent('onclick',handler);
btn.attachEvent('onclick',handler1);
function handler(){
  alert('click');
}
function handler1(){
  alert('click1');
}
btn.detachEvent('onclick',handler);
//IE中添加多个事件处理程序,执行的顺序与添加的顺序相反,也就是说我们会先看到'click1'弹出再看到'click'
跨浏览器事件处理程序

为了保证一个代码能兼容不同的浏览器,我们需要判断浏览器的兼容情况再做处理

var EventUtil = {
  addHandler:function(element,type,handler){
    if(element.addEventListener){
      element.addEventListener(type,hanlder,false)
    }
    else if(element.attachEvent){
      element.attachEvent('on'+type,handler)
    }
    else{
      element['on'+type] = handler;
    }
  },
  removeHandler:function(element,type,handler){
     if(element.addEventListener){
      element.removeEventListener(type,hanlder,false)
    }
    else if(element.attachEvent){
      element.detachEvent('on'+type,handler)
    }
    else{
      element['on'+type] = null;
    }
}
}

function handler(){
  alert('click');
}
var btn = document.getElementById('btn');
EventUtil.addHandler(btn,'click',handler);
EventUtil.removeHandler(btn,'click',handler);

这个程序中我们先判断支不支持DOM2级的事件处理程序,然后是IE事件处理程序,最后是DOM0事件处理程序,满足不同的情况做出相应的操作,完美实现了跨浏览器的事件处理程序.

上一篇 下一篇

猜你喜欢

热点阅读