前端菜鸟学习之DOM事件处理
一、事件处理程序
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事件处理的更多相关文章
- 前端开发学习之——dom ready和window onload的区别
1.ready事件是在页面中所有DOM结构已完全加载时执行,监听的是 DomContentload 事件,初始化并解析完成时触发,不需要等待样式表.图片和 iframes 加载完,也就是说当这个事件触 ...
- web前端开发学习内容
应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准 代码能 兼容主流浏览器.ie6.7.8.9 ff 等. ...
- 前端MVC学习总结——AngularJS验证、过滤器
前端MVC学习总结--AngularJS验证.过滤器 目录 一.验证 二.过滤器 2.1.内置过滤器 2.1.1.在模板中使用过滤器 2.1.2.在脚本中调用过滤函数 2.2.自定义过滤器 三.指令( ...
- 【菜鸟学习jquery源码】数据缓存与data()
前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...
- web前端开发学习:jQuery的原型中的init
web前端开发学习:jQuery的原型中的init 有大量web前端开发工具及学习资料,可以搜群[ web前端学习部落22群 ]进行下载,遇到学习问题也可以问群内专家以及课程老师哟 jQuery.fn ...
- Web前端的学习介绍(截止今天还有Bootstrap没有学,要腾点时间解决掉)
Web前端的学习分为以下几个阶段,具体的学习路线图如图所示. 第一阶段——HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静 ...
- web前端的学习误区
web前端的学习误区 网页制作是计算机专业同学在大学期间都会接触到的一门课程,而学习网页制作所用的第一个集成开发环境(IDE)想必大多是Dreamweaver,这种所见即所得的“吊炸天”IDE为我们 ...
- 绝版珍珍藏:web前端技术学习指南
绝版珍珍藏:web前端技术学习指南 优秀的Web前端开发工程师要在知识体系上既要有广度和深度!应该具备快速学习能力. 前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的 ...
- 彻底搞懂DOM事件处理(零)引子
通过合理使用JavaScript,可以为网站用户提供更好的交互体验.这主要是因为JavaScript能够让网站对用户的各种操作及时做出"反馈".这种"反馈"使网 ...
随机推荐
- 0 can't find referenced pointcut declarePointExpress
今天在用SpringAOP 的 @pointCut 的时候报错 Exception in thread "main" org.springframework.beans.facto ...
- Jquery一些常用的方法
整理以前的笔记,在学习JavaScript时候,经常会用到一些方法,但是有时忘掉了具体用法,因此记下.方便以后查阅. 这篇博文先说明这些方法的用途: removeClass().remove().cs ...
- Linux学习——shell编程之运算符
shell编程之运算符 一:shell中常见算术运算符号和优先级 二:算术运算符 Shell 变量:是弱类型!不能进行加减乘除!比较麻烦! 例子 :shell变量弱类型 a=11 b=22 echo ...
- hive自定义UDF
udf udaf udtf 使用方式 hiverc文件 1.jar包放到安装日录下或者指定目录下 2.${HIVE_HOME}/bin目录下有个.hiverc文件,它是隐藏文件. 3.把初始化语句加载 ...
- 【POJ】1067 取石子游戏(博弈论)
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- angular学习-01,使用第三方库(jquery...)
开发环境(window) 1.安装node https://nodejs.org/en/ 2.安装angular-cli npm install -g @angular/cli 3.使用ng new ...
- NOIP2017SummerTraining0713
个人感受:这套题是真的难,以至于,拿了130分就第三了(说来羞耻,真的不想---) 问题 A: 乐曲创作 时间限制: 1 Sec 内存限制: 256 MB提交: 370 解决: 58[提交][状态 ...
- python之decode、encode及codecs模块
一.先说说编解码问题 编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码. Eg: str ...
- 学习的Python教程中的一些问题
2017开始学习Python,在网上找了很多教程,最后看到了Vamei的教程,感觉很简单易懂,但是过程中难免有不太容易理解的问题,做一些随笔,加深记忆亦可让以后学习的同学少走一些弯路. 1 Pytho ...
- 提纲挈领webrtc之vad检测
顾名思义,VAD(Voice Activity Detection)算法的作用是检测是否是人的语音,它的使用 范围极广,降噪,语音识别等领域都需要有vad检测.vad检测有很多方法,这里我们之介绍一 ...