一、事件处理程序

  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. ArrayList,LinkedListd等容器使用时注意点:

    1.对这两个List(包括其他的类似容器),如果向里面加入一个元素(引用数据类型),那么这个List里面保存的是这个对象的引用: 如果想要避免这种现象可以这样:在加入新的元素时不直接压,将已有的对象复 ...

  2. [转载]iOS开发之手势识别

    感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextVi ...

  3. Java线程池带图详解

    线程池作为Java中一个重要的知识点,看了很多文章,在此以Java自带的线程池为例,记录分析一下.本文参考了Java并发编程:线程池的使用.Java线程池---addWorker方法解析.线程池.Th ...

  4. TEXT宏

    TEXT宏是windows程序设计中经常遇到的宏,定义在 <winnt.h>中 TCHAR *P = TEXT("this is a const string"); 如 ...

  5. [转]HDFS HA 部署安装

    1. HDFS 2.0 基本概念 相比于 Hadoop 1.0,Hadoop 2.0 中的 HDFS 增加了两个重大特性,HA 和 Federaion.HA 即为 High Availability, ...

  6. Bmob云IM实现头像更换并存入Bmob云数据库中(1.拍照替换,2.相册选择)

    看图效果如下: 1.个人资料界面 2.点击头像弹出对话框 3.点击拍照 4.切割图片,选择合适的部分 5.点击保存,头像替换完毕,下面看从相册中选择图片. 6.点击相册 7.任选一张图片 8.切割图片 ...

  7. Beauty Contest 凸包+旋转卡壳法

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27507   Accepted: 8493 D ...

  8. Sum It Up 广搜

    Sum It Up Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  9. nginx配置文件作用介绍

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  10. 【机器学习实战】第11章 使用 Apriori 算法进行关联分析

    第 11 章 使用 Apriori 算法进行关联分析 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出 ...