事件(二):事件处理程序

click,load,mouseover都是事件的名字,而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以'on'开头,onclick,onload

事件处理程序(html事件处理程序,dom0级事件处理程序,dom2级事件处理程序,ie事件处理程序,跨浏览器事件处理程序)

html事件处理程序

1、内置js

<input type='button' value='click me' onclick='alert("clicked")'/>

当点击这个按钮时,就会显示一个警示框
注意:不能在其中使用未经转义的html语法字符 例如双引号(""),小于号(<),大于号(>)。

<input type='button' value='click me' onclick='alert("clicked")'/>

 

2、函数调用

<script type='text/javascript'>function showMessage(){alert('Hello world');}
</script>
<input type='button' value='click me' οnclick='showMessage()'/>

 

事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码

3、其他

<input type='button' value='click me' onclick='alert(value)'/>
=
<input type='button' value='click me' onclick='alert(this.value)'/>

 

this值等于事件的目标元素

<input type='button' value='click me' onclick='alert(event.type)'/>

 

通过event变量,可以直接访问事件对象,不用自己定义它

<form action="" post='post'><input type='text' value='click me' name='username'/><input type='button' value='click me' onclick='alert(username.value)'/>
</form>

 

扩展作用域,让事件处理程序无需引用表单元素就能访问其他表单字段

html事件处理程序的缺点:
1、如果用户在html元素一出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行条件。
2、这样扩展事件处理程序的作用域链在不同浏览器中会导致不同的结果,不同js引擎遵循的标识符解析规则略有差异,很可能会在访问非限定对象成员时出错。
3、html与js代码紧密耦合。如果要更换事件处理程序,就要改动两个地方:html代码和js代码。

DOM0级事件处理程序

通过js指定事件处理程序的传统方式,就是将一个函数赋值给一个事件处理程序属性。eg:

 <script>var btn = document.getElementById('myBtn');btn.onclick=function(){alert('clicked');}
</script>
<input type='button' value='click me' id='myBtn'/>

 

使用dom0级方法指定的事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在元素的作用域中运行;换句话说,程序中通过this引用当前元素

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

 

在事件处理程序中通过this访问元素的任何属性和方法。以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理

btn.onclick = null;//删除事件处理程序

 

将事件处理程序设置为null后,再单击按钮将不会有任何动作发生

DOM2级事件处理程序

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)

 

DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener();所有dom都包含这两个方法,并且它们都接受3个参数:
要处理的事件名
作为事件处理程序的函数
一个布尔值(true表示捕获阶段调用事件处理程序,false表示冒泡阶段调用事件处理程序)
特点:
1、与dom0级一样,这里添加的事件处理程序依附在作用域中运行(要先加载dom,再加载js)
2、可以添加多个事件处理程序

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)
btn.addEventListener('click',function(){alert('Hello world');
},false)

 

3、通过addEventListener()添加的事件处理程序只能使用removeEventListener()移除,移除时传入的参数与添加处理程序时的参数相同,这也意味着addEventListener()添加的匿名函数将无法移除

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)//省略其它代码

btn.removeEventListener('click',function(){  //没有用alert(this.id);
},false)

 

看似使用了相同的参数,实际上,第二个参数与传入的那个时完全不同的函数

var btn = document.getElementById('myBtn');
var handler = function(){alert(this.tid)
}
btn.addEventListener('click',handler,false)//省略其它代码

btn.removeEventListener('click',handler,false);//有效

 

IE事件处理程序

IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。这两个方法接受相同的两个参数:事件处理程序名称与事件处理程序函数,由于IE8及更早版本支持事件冒泡,所以通过attachEvent()添加的事件处理程序都会被添加到冒泡阶段

var btn = document.getElementById('myBtn');
btn.attachEvent('onclick',function(){alert('Clicked'); alert(this === window); //true
})
btn.attachEvent('onclick',function(){alert('Hello World'); 
})

 

注意:
1、dom0在其所属元素的作用域内运行,使用attachEvent()方法的情况下,事件处理程序会在全局作用中运行,this等于window,如果在编写跨浏览器的代码时,牢记这一区别非常重要
2、与addEventListener类似,可以为一个元素添加多个事件处理程序
3、与dom不同的是,这些事件处理程序不是以添加它们的顺序执行,而是以相反的顺序被触发,单机这个例子,首先会看到hello world,然后才是clicked
4、使用attachEvent()添加的事件可以通过detachEvent()来移除,条件是必须提供相同的参数。与DOM方法一样,这也意味着添加的匿名函数将不能被移除

var btn = document.getElementById('myBtn');
var handler = function(){alert('Clicked');
}
btn.attachEvent('onclick',handler);
//这里省略了其他代码
btn.detachEvent('onclick',handler);

 

跨浏览器的事件处理程序

要保证处理事件的代码能在大多数浏览器下一致运行,只需关注冒泡阶段。第一个要创建的方法是addHandler(),它的职责视情况分别使用dom0级方法、dom2级方法或ie方法来添加事件

var EventUtil = {addHandler:function(element,type,handler){if(element.addEventListener){element.addEventListener(type,handler,false);}else if(element.attachEvent){element.attachEvent('on'+type,handler)}else{element['on'+type] = handler;}},removeHandler:function(element,type,handler){if(element.removeEventListener){element.removeEventListener(type,handler,false);}else if(element.detachEvent){element.detachEvent('on'+type,handler);}else{element['on'+type] = null;}}
}

 

转载于:https://www.cnblogs.com/wzndkj/p/7907048.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网激荡MEMS传感器浪潮

来源&#xff1a;第三代半导体联合创新孵化中心物联网悄然而至。如今&#xff0c;物联网已进入跨界融合、集成创新和规模化发展新阶段&#xff0c;将为经济社会发展注入新活力&#xff0c;培育新动能。物联网在交通、物流、环保、医疗、安防、电力等领域的应用逐渐得到规模化验…

如何判断是linux/windows库,module或程序debug还是release(转)

linux&#xff1a; readelf -S xxx.a |grep "\.debug*" 如果有输出, 是debug, 没有是release windows&#xff1a; dumpbin /DEPENDENTS xx.dll, 结果输出中有MSVCRTD.dll的是debug版本. 为了脚本自动判断, 可用powergrep等工具自动分拣. .lib和我们的编译选项有…

发布功能完成。

编写要求登录的装饰器from functools import wraps def loginFirst(func): #参数是函数 wraps(func) def wrapper(*args, ** kwargs): #定义个函数将其返回 #要求登录 return func(*args, ** kwargs) return wrapper #返回一个函数 应用装饰器&#xff0c;要求在发布前进行登录…

git clone报错

问题&#xff1a;error: RPC failed; curl 18 transfer closed with outstanding read data remaining 方法&#xff1a;&#xff08;一般http方式会用到&#xff09; $ git clone 仓库地址 --depth 1 $ cd 项目目录 $ git fetch --unshallow 附带&#xff1a;指定分支命令 …

《自然》《科学》相继发文批评质疑:俄罗斯注册新冠疫苗“让众人面临风险”...

来源&#xff1a;环球科学编译丨杨心舟8月11日&#xff0c;俄罗斯总统普京在与政府成员举行会议时透露&#xff0c;俄罗斯已经注册世界第一种新冠肺炎疫苗。普京表示&#xff0c;这款疫苗非常有效&#xff0c;能够形成稳定的免疫力并且已通过所有的检查&#xff0c;并且自己的女…

翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

原文地址&#xff1a;Functional-Light-JS原文作者&#xff1a;Kyle Simpson&#xff0d;《You-Dont-Know-JS》作者关于译者&#xff1a;这是一个流淌着沪江血液的纯粹工程&#xff1a;认真&#xff0c;是 HTML 最坚实的梁柱&#xff1b;分享&#xff0c;是 CSS 里最闪耀的一瞥…

python 去除不可见字符\x00

读取出来的字节&#xff1a;testa b‘testa\x00’ 去掉\x00&#xff1a;testa.decode().strip(b\x00.decode()) 经测试多个\x00也可以去掉

思未尽,行致远丨记 IBM 成立 109周年

来源&#xff1a;IBM中国主创团队&#xff08;IBM Social & Studio DL team&#xff09;策划&#xff1a;点亮 IBM 庆生蜡烛的甜心御姐 June撰稿&#xff1a;被百年“名场面”感动 cry 的原创一哥 Raphal设计&#xff1a;熬出黑眼圈也要操刀设计的鲁先森排版&#xff1a;话…

RAC(ReactiveCocoa)使用方法(二)

RAC(ReactiveCocoa)使用方法(一)RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用法&#xff0c;这篇文章主要总结日常开发中结合一些UI控件的用法。 RAC给常见的很多UI类拓展了用法&#xff0c;使得开发变得越来越简…

unordered_map使用自定义enum作为键值

首先定义模板作为unordered_map的第三个参数&#xff1a; struct EnumClassHash {template <typename T>std::size_t operator()(T t) const{return static_cast<std::size_t>(t);} }; 使用&#xff1a; enum class MyEnum {};std::unordered_map<MyEnum, i…

王恩哥院士:信息化发展进程中,科学、基础研究和技术、应用都是关键

图为王恩哥院士接受新华网采访来源&#xff1a;新华网由深圳市人民政府指导&#xff0c;中国信息化百人会主办&#xff0c;华为技术有限公司协办的中国信息化百人会2020年峰会于8月7日启幕。会上&#xff0c;中国信息化百人会顾问、中国科学院院士、北京大学原校长、中国科学院…

数据传址赋值问题

例如&#xff1a; int a 0&#xff1b; void test (&a) { for (int i 0; i < 10; I) { *a; } } 并不能拿到想要的值&#xff0c;反而可能都是随机值&#xff0c;最好使用*a 1。因为*a是先a后*取值&#xff0c;导致指针位置变化&#xff0c;值并没有变。

js 时间格式化

/*** 获取本周、本季度、本月、上月的开始日期、结束日期*/var now new Date(); //当前日期 var nowDayOfWeek now.getDay(); //今天本周的第几天 var nowDay now.getDate(); //当前日 var nowMonth now.getMonth(); //当前月 var nowYear now.getYear(); //当前年 n…

英特尔的六大新技术

来源&#xff1a;芯东西&#xff08;公众号&#xff1a;aichip001&#xff09; 芯东西8月14日消息&#xff0c;昨日晚间&#xff0c;英特尔在2020年架构日上推出10nm SuperFin晶体管技术&#xff0c;将实现其有史以来最强大的单节点内性能增强。据悉&#xff0c;10nm SuperFin技…

c++查找pair,使用map,unordered_map,vector

map和unordered_map都可以简单的实现&#xff0c;因为本身就是键值对&#xff0c;而且都提供find方法&#xff0c;相对来说unordered_map比map略快。 vector使用find_if函数&#xff0c;并且最简单的用法就是c 特性中的lambda&#xff0c;例如&#xff1a; static vector<…

判断jQuery选择器结果为空 - CSDN博客

判断jQuery选择器结果为空 - CSDN博客 原文:判断jQuery选择器结果为空 - CSDN博客jQuery选择器获取到的是一个对象&#xff0c;所以无论页面上存在或者不存在元素&#xff0c;这个对象都不为空。因此&#xff0c;如果要使用jQuery检查元素再给某个页面上是否存在的时候&#xf…

中国芯片设计云技术白皮书2.0发布

来源&#xff1a;摩尔精英作为行业内专业的IT/CAD技术服务团队&#xff0c;摩尔精英IT/CAD事业部曾于2019年11月21日的南京ICCAD大会上发表的《芯片设计云计算白皮书1.0》中&#xff0c;初步探索了基于公有云的EDA计算平台的实现方案。随着进一步的探索和方案优化&#xff0c;我…

c++中unordered_map的坑

unordered_map本身有hash表&#xff0c;不排序的情况下&#xff0c;对需要键值对的数据处理是比较方便的&#xff0c;存储、查找都很快了&#xff0c;但是如果不注意键值类型的话&#xff0c;有可能会掉坑的。 比如&#xff1a; unordered_map<string, vector<BigTestS…

课后作业-阅读任务-阅读笔记4

1.程序的质量体现在软件外在功能的质量 2.软件开发过程有三个主要的特性&#xff1a;好&#xff0c;快&#xff0c;便宜 3.CMMI有两种不同的实施方法&#xff0c;其级表示不同的内容&#xff1a; &#xff08;1&#xff09;连续式&#xff1a;主要是衡量一个企业在某一项目中的…

c#使用Path.Combine的一个坑

本想先解一个目录&#xff0c;再重组一个新目录存结果文件&#xff0c;想到用Path.Combine可以方便快捷&#xff0c;结果就遇见了坑&#xff0c; windows目录下有驱动器符号如“d:”&#xff0c;这时候使用Path.Combine并不会组成想要的路径&#xff1a; 理想状态下Path.Comb…