一、事件处理程序

  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. Magento 2.1.X 插件(Plugin)的创建

    Magento 2的插件主要作用:在Magento 1中,为了自定义不同的类和方法,你可以重写一个类. 这是一个非常强大和灵活的定制平台的方式. 这也造成了麻烦,因为两个模块不可以重写同一个类, 重写 ...

  2. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  3. 优秀的CSS预处理----Less

    Less语法整理 本人邮箱:kk306484328@163.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/kk-here/p/7601058.html ...

  4. iOS Storyboard约束详解

    链接:http://www.jianshu.com/p/b88c65ffc3eb 约束,就是指--此处略去1万字--都懂的,就不说了.直接进入实战环节. 本文的控件约束都是围绕着UITableView ...

  5. bzoj4557【JLOI2016】侦查守卫

    这道题对于我来说并不是特别简单,还可以. 更新一下blog 树形DP f[i][j]表示i的子树中,最高覆盖到i向下第j层的最小花费. g[i][j]表示i的子树全部覆盖,还能向上覆盖j层的最小花费. ...

  6. bzoj3997组合数学(求最长反链的dp)

    组合数学 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...

  7. java数据库编程之初始Mysql

    2.3:命令行连接mySql 2.3.1:检查是否启动服务 步骤:计算机-----管理------服务和应用程序-------服务---搜索mysql右键启动服务 2.3.2:命令行方式连接数据库 步 ...

  8. FTP基本操作类大全,外加c#基础公共帮助类

    总结平时用到的一些FTP操作类,方便需要的用到.github地址:https://github.com/Jimmey-Jiang/Common.Utility 1.连接FTP服务器 /// <s ...

  9. Scala类型系统(sudden thought)

    http://docs.scala-lang.org/tour/lower-type-bounds.html中有一段代码 trait Node[+B] { def prepend(elem: B): ...

  10. Extjs6(七)——增删查改之删除

    本文基于ext-6.0.0 页面就是前面写的那个,有不清楚的可以看一下前面写页面那篇. 一.在toolbar加一个删除按钮 { text:'删除', iconCls:'x-fa fa-times', ...