一、事件处理程序

  1.DOM0级事件处理程序:就是将一个函数赋值给一个事件处理程序属性,至今仍为现代所有浏览器所支持,主要得益于其跨浏览器的优势,要使用DOM0级事件,首先要得到操作对象的引用,具体实例如下图所示。    

    var oBtn = document.querySelector('.btn');
oBtn.onclick = function(){
alert(‘click’);
}

  这样就为oBtn元素指定了一个onclick的事件处理程序,当然也可以删除给该元素添加的事件处理程序,其方法如下:

  oBtn.onclick = null;

  再次单击按钮不会有任何动作发生。

  2.DOM2级事件处理程序:'DOM2级事件'定义了两个方法:addEventListener()(用于添加和指定事件处理程序)和removeEventListener()(用于删除事件处理程序),这两个函数接收三个参数:1.要处理的事件类型,2.事件处理程序函数fn,3.布尔值,如果这个布尔值是true,表示在捕获阶段调用事件处理程序,如果是false,表示在冒泡阶段调用事件处理程序。具体实例如下图所示:

     var oBtn = document.querySelector('.btn');
oBtn.addEventListener('click',function(){
alert('click');
},false);

  与DOM0级事件相比,DOM2级事件的好处是可以给同一个元素添加多个事件处理程序而不被覆盖,看下面例子:

    var oBtn = document.querySelector('.btn');
oBtn.addEventListener('click',function(){
alert('click1');
},false);
oBtn.addEventListener('click',function(){
alert('click2');
},false);

  其结果会依次弹出click1,click2。但是如果采用DOM0级事件处理,则会产生覆盖。

   var oBtn = document.querySelector('.btn');
oBtn.onclick = function () {
alert(66);
}
oBtn.onclick = function () {
alert(99);
}

  其结果只会弹出99。但是采用DOM2级事件在ie中会有兼容问题(ie8以及更早的版本不支持),下面会马上说ie的事件处理程序。

  3.ie的事件处理程序:实现了与DOM中类似的两个方法:attachEvent()(添加指定的事件处理程序) 和detachEvent(删除指定的事件处理程序),这两个方法有两个参数:事件类型,事件处理函数。请看下面的例子。

 var oBtn = document.querySelector('.test');
oBtn.attachEvent('onclick',function(){
alert('click');
});

  注意这里函数的事件类型要写成onclick形式,在DOM2级事件里须写成click形式。还有个需要注意的问题就是IE事件处理程序函数中this的指向,DOM事件处理程序函数里面的this指的是绑定事件的元素本身,而在使用attachEvent()方法时,事件处理程序会在全局作用域中运行,因此这里的this指向的是window对象。

    var oBtn = document.querySelector('.test');
oBtn.attachEvent('onclick',function(){
alert(window === this);//true
});
  var oBtn = document.querySelector('.test');
oBtn.addEventListener('click',function(){
alert(this === oBtn); //true
},false);
  var oBtn = document.querySelector('.test');
oBtn.onclick = function () {
alert(this === oBtn);//true
}

 支持ie事件处理程序的浏览器有ie和opera;

 4.跨浏览器的事件处理程序:能够实现视情况分别使用DOM0级事件、DOM2级事件或IE方法来添加事件的功能,将实现过程封装在一个名叫EventUtil的对象中。

 var EventUtil = {
addHandler:function(element,type,handler){//添加事件处理程序
if(element.addEventListener){
element.addEventListener(type,handler,false); //DOM2级
}else if(element.attachEvent){
element.attachEvent('on'+type,handler);//IE方法
}else{
element['on' + type] = handler; //DOM0级
}
},
removeHandler:function(){ //删除事件处理程序
if(element.removeEventListener){
element.removeEventListener(type,handler);
}else if(element.detachEvent){
element.detachEvent('on'+type,handler);
}else{
element['on' + type] = null;
}
}
}

  调用EventUtil 中的addHandler方法,首先会检测传入的元素中是否存在DOM2级方法,如果存在,则使用该方法,如果存在的是IE的方法,则使用第二种方案,如果前面两种方案都无效,则默认采用DOM0级事件。下面来看个使用的例子:

  var oBtn = document.querySelector('.btn');
var handler = function () {
alert(66);
}
EventUtil.addHandler(oBtn, 'click', handler);

  

  

    

    

前端菜鸟学习之DOM事件处理的更多相关文章

  1. 前端开发学习之——dom ready和window onload的区别

    1.ready事件是在页面中所有DOM结构已完全加载时执行,监听的是 DomContentload 事件,初始化并解析完成时触发,不需要等待样式表.图片和 iframes 加载完,也就是说当这个事件触 ...

  2. web前端开发学习内容

    应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准                       代码能 兼容主流浏览器.ie6.7.8.9 ff 等.    ...

  3. 前端MVC学习总结——AngularJS验证、过滤器

    前端MVC学习总结--AngularJS验证.过滤器 目录 一.验证 二.过滤器 2.1.内置过滤器 2.1.1.在模板中使用过滤器 2.1.2.在脚本中调用过滤函数 2.2.自定义过滤器 三.指令( ...

  4. 【菜鸟学习jquery源码】数据缓存与data()

    前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...

  5. web前端开发学习:jQuery的原型中的init

    web前端开发学习:jQuery的原型中的init 有大量web前端开发工具及学习资料,可以搜群[ web前端学习部落22群 ]进行下载,遇到学习问题也可以问群内专家以及课程老师哟 jQuery.fn ...

  6. Web前端的学习介绍(截止今天还有Bootstrap没有学,要腾点时间解决掉)

    Web前端的学习分为以下几个阶段,具体的学习路线图如图所示. 第一阶段——HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静 ...

  7. web前端的学习误区

    web前端的学习误区  网页制作是计算机专业同学在大学期间都会接触到的一门课程,而学习网页制作所用的第一个集成开发环境(IDE)想必大多是Dreamweaver,这种所见即所得的“吊炸天”IDE为我们 ...

  8. 绝版珍珍藏:web前端技术学习指南

    绝版珍珍藏:web前端技术学习指南 优秀的Web前端开发工程师要在知识体系上既要有广度和深度!应该具备快速学习能力. 前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的 ...

  9. 彻底搞懂DOM事件处理(零)引子

    通过合理使用JavaScript,可以为网站用户提供更好的交互体验.这主要是因为JavaScript能够让网站对用户的各种操作及时做出"反馈".这种"反馈"使网 ...

随机推荐

  1. android自定义动画

    前一篇说了实现过程,这次来写一个自己简单实现的3d动画 先来属性声明配置,方便使用xml 文件来定制动画 <!-- 有些类型其实是没必要的,只是实例代码,为了更具有代表性 --> < ...

  2. Java源码学习:HashMap实现原理

    AbstractMap HashMap继承制AbstractMap,很多通用的方法,比如size().isEmpty(),都已经在这里实现了.来看一个比较简单的方法,get方法: public V g ...

  3. Grunt针对静态文件的压缩,版本控制打包方案

    在讲之前先谈谈大致步骤:安装nodejs -> 全局安装grunt -> 项目创建package.json --> 项目安装grunt以及grunt插件 -> 配置Gruntf ...

  4. Hive内置数据类型

    Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...

  5. Longge's problem poj2480 欧拉函数,gcd

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6918   Accepted: 2234 ...

  6. qplot函数用法(转载)

    http://blog.csdn.net/u014801157/article/details/24372499 写的很全面 放在这里记录下

  7. h5 meta学习

    定义针对搜索引擎的关键词:<meta name="keywords" content="meta,red" /> 定义对页面的描述:<meta ...

  8. 使用Dapper进行参数化查询

    在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入 ...

  9. 在项目中创建单元测试时junit的配置和使用

    首先配置项目中AndroidMainfest.xml文件,加入 <instrumentation android:name="android.test.InstrumentationT ...

  10. OC实现同步访问属性

    有时候,我们在开发过程中需要对属性的访问进行同步操作,这种属性需要做成原子的,用atomic来修饰属性,即可实现这一点. 如果我们想自己实现,可以按照下面方式写代码: SFPerson.h #impo ...