一、事件处理程序

a.     DOM0级事件处理程序,被认为是元素的方法。

var btn=document.getElementById('myBtn');
btn.onclick=function(){
alert(this.id); //'myBtn'
};

在事件处理程序中,通过this访问元素的任何属性和方法。

b.    DOM2级事件处理程序

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

所有节点都包含这两个方法,都接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。如果这个布尔值为true,表示在捕获阶段调用事件处理程序;如果这个布尔值为false,表示在冒泡阶段调用事件处理程序。

obj.addEventListener('click',function(){
console.log('捕获模式');
},true);
obj.addEventListener('click',function(){
  console.log('冒泡模式');
},false);

使用DOM2级方法添加事件处理程序的主要好处是可以添加多个事件处理程序,并按照添加顺序触发。

通过addEventListener( )添加的事件处理程序只能使用removeEventListener()来移除,移除时传入的参数与添加处理程序时使用的参数相同。因此,通过addEventListener( )添加的匿名函数将无法删除。

var btn=document.getElementById('myBtn');
btn.addEventListener('click',function(){
alert(this.id);
},false);
//此时removeEventLister方法无效,因为function是匿名函数,与addEventListener中的不同。
btn.removeEventListener('click',function(){
alert(this.id);
},false);

正确方式:

var btn=document.getElementById('myBtn');
var handle =function(){
alert(this.id);
};
btn.addEventListener('click',handle,false);
//此时removeEventListener有效
btn.removeEventListener('click',handle,false);  

IE9,Firefox,Safari,Chrome和Opera支持DOM2级事件处理程序。

c.     IE事件处理程序

IE实现了与DOM中类似的两个方法:attachEvent( )和detachEvent()。

这两个方法相同的两个参数:事件处理程序名称与事件处理程序函数。IE8级之前版本只支持事件冒泡,所以通过attachEvent( )添加的时间处理程序都会被添加到冒泡阶段。

var btn=document.getElementById('myBtn');
var handle =function(){
alert(this.id);
};
btn.attachEvent('onclick',handle);

注意:在通过detachEvent( )来移除使用attachEvent()添加的事件时,条件是必须提供相同的参数,与DOM方法一样,添加的匿名函数也不能被移除。

在IE中使用attachEvent()与使用DOM0级方法的主要区别在于事件处理程序的作用域。

DOM0级方法中,事件处理程序会在其所属元素的作用域内运行,在使用attachEvent() 方法时,事件处理程序会在全局作用域中运行,因此,this等于window。

二、 IE与Firefox的事件机制区别

IE8及以前版本

Firefox即IE9+

事件处理方法

attachEvent( )和detachEvent( )

addEventListener( )和removeEventListener()

接受参数

两个:事件处理程序名称和事件处理程序函数

三个:事件处理程序名称,事件处理程序函数,布尔值

支持事件类型

仅支持事件冒泡

支持事件冒泡和事件捕获

第一个参数

需在事件前添加on,例如onclick

不需在事件前添加on,例如click

为一个元素添加多个事件处理程序执行顺序

按照与添加顺序相反的顺序执行,即后添加,先执行

按照添加顺序执行,即先添加,先执行

移除事件,参数设置

detachEvent( )中的参数需与attachEvent( )传入的参数一致,即两个参数

removeEventListener( )中的参数addEventListener( )传入的参数一致,即要三个参数

三、跨浏览器的事件处理程序

var EventUtil = {  
  // 添加事件
addHandler:function(element,type,handle){
if (element.addEventListener) {
element.addEventListener(type,handle,false);
}else if(element.attachEvent){ //IE
element.attachEvent("on"+type,handle);
}else{
element["on"+type]=handle;
},
  //删除事件
removeHandle:function(element,type,handle) {
if (element.removeEventListener) {
element.removeEventListener(type,handle,false);
}else if (element.detachEvent) {
element.detachEvent("on"+type,handle);
    }else{
element["on"+type]=null;
}
}
}
};
var btn=document.getElementById('myBtn');
var handle = function(){
  alert("Cliked");
  };
EventUtil.addHandler(btn,"click",handle);
EventUtil.removeHandle(btn,"click",handle);

js事件处理机制的更多相关文章

  1. Cocos2d-JS事件处理机制

    在很多图形用户技术中,事件处理机制一般都有三个重要的角色:事件.事件源和事件处理者.事件源是事件发生的场所,通常就是各个视图或控件,事件处理者是接收事件并对其进行处理的一段程序.事件处理机制中三个角色 ...

  2. 从浏览器多进程到JS单线程,JS运行机制的一次系统梳理

    前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...

  3. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    前言 来源:https://dailc.github.io/2018/01/21/js_singlethread_eventloop.html 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会 ...

  4. Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制

    Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 ...

  5. js执行机制

    js是单线程的,为什么可以执行异步操作呢? 这归结与浏览器(js的宿主环境)通过某种方式使得js具备了异步的属性. 区分进程和线程: 进程:正在运行中的应用程序.每个进程都自己独立的内存空间.例如:打 ...

  6. Cocos2d-x之事件处理机制

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 事件处理机制分为单点触屏,多点触屏,加速度事件,键盘事件和鼠标事件.在现在的智能手机中,触屏的应用比较的广泛,尤其是多点触屏事件的技术,使 ...

  7. Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)

    一.Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使用稳定版本. 2.上传Nginx到Linux服务器. 3.安装依赖环 ...

  8. java 事件处理机制:按下上下左右键控制小球的运动

    /** * 加深对事件处理机制的理解 * 通过上下左右键来控制一个小球的位置 */package com.test3;import java.awt.*;import javax.swing.*;im ...

  9. Android事件处理机制

    包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将 ...

随机推荐

  1. 通过HWND获得CWnd指针

    cwnd 又为计算机网络中拥塞窗口(congestion window)的简写.拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化.发送方让自己的发送窗口还可能小于拥塞窗口. CWnd是MFC窗口类 ...

  2. gitlab open ssl

    cd /home/git/gitlab/ sudo -u git -H vi config/gitlab.yml sudo -u git -H vi /home/git/gitlab-shell/co ...

  3. 深入浅出设计模式——外观模式(Facade Pattern)

    模式动机引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必 ...

  4. 使用 InstallShield 制作 Delphi 软件安装包

    软件版本: InstallShield 12 Delphi 5/7 SQL Server 2005 一.配置软件信息 二.软件安装的需求配置 三.安装架构 四.安装需要的文件 软件的安装路径.可执行文 ...

  5. ASP.Net Web.config 中引用外部config文件

    1. 前提准备: Web.config file: <?xml version="1.0" encoding="utf-8"?><config ...

  6. git drupal eclipse

    eclispe如何打补丁https://www.drupal.org/patch/apply打patch,初级详细教程https://www.drupal.org/node/620014

  7. CAD迷你看图

    CAD迷你看图http://www.aec188.com/CAD迷你看图 2016R12超快.超小的CAD多功能看图工具,完全脱离AutoCAD浏览R14-R2016各版本DWG/DXF/DWF的二三 ...

  8. Caché数据库学习笔记(1)

    目录: Caché的概念和基础知识 Caché数据库的安装 创建命名空间(namespace)和数据库(database) Documentation的使用 ===================== ...

  9. ubuntu忘记密码怎么办

    刚安装了,ubuntu14.04,就想着,如果忘记登录密码,这可不好办,所以测试下开机,刚过bios显示画面,不停的点击,,键盘左边的shift键.(因为刚开始是采用按着不放的办法,结果不灵.所以我不 ...

  10. iOS应用之间跳转

    本篇博文将涉及到以下知识点: app应用跳转的原理解析 如何实现两个app应用之间的跳转 如何实现两个app之间跳转到指定界面 二.应用跳转原理 相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫 ...