深入理解在JS中通过四种设置事件处理程序的方法


Posted in Javascript onMarch 02, 2017

所有的JavaScript事件处理程序的作用域是在其定义时的作用域而非调用时的作用域中执行,并且它们能存取那个作用域中的任何一个本地变量。但是HTML标签属性注册处理程序就是一个例外。看下面四种方式:

第一种方式(HTML标签属性):

<input type="button" id="btn1" value="测试" onclick="alert(this.id);" />

上面的代码是通过设置HTML标签属性为给button 添加了点击事件,当点击button 按钮时会弹出这个button的id,即btn1。

这种通过HTML属性来注册事件处理程序是一个例外。它们被转换为能存取全局变量的顶级函数而非任何本地变量。由于历史的原因,它们运行在一个修改后的作用域链中。通过HTML属性定义的事件处理程序能像本地变量一样使用目标对象、容器对象(form)对象和document对象的属性。它会被浏览器转换为类似如下的代码:

function (event){
  with(document){
   with(this.form||{}){
    with(this){
     /*具体的事件处理代码*/
    }
   }
  }  
}

关于with的用法,可以自行查阅,这里后面有文章讲解。读者先自行了解一下。提供一个连接(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with)

这种方式现在已经不推荐使用。

第二种方式(调用函数)

<input type="button" id="btn2" value="测试" onclick="test()" />
<script type="text/javascript">
  function test(){
   alert(this.id);
  }
</script>

这段代码弹出来的是undefined。

这种设置方式是通过调用全局函数来进行的,这时this指向的是window,而非这个button的调用者,可以通过输出console.log(this==window);来进行验证

第三种方式(调用函数)

<input type="button" id="btn3" value="测试" />
<script type="text/javascript">
   var btn3 = document.getElementById("btn3");
        btn3.onclick = function () {
          alert(this.id);
        };
</script>

这段代码弹出来的是btn3。

这种事件处理程序在事件目标上定义,所以它们作为这个对象的方法来调用(但是下面在IE里面有个例外)。这就是说在事件处理程序内,this关键字指的是事件目标。

当使用addEventListener()注册时,调用的处理程序使用事件目标作为它们的this值。但是对于还用attachment()注册的处理程序作为函数调用,它们的this值是全局(window)对象。就是说的第四中方式

第四种方式(通过addEventListener和attachment):

<input type="button" id="btn3" value="测试" onclick="test()" />
 var btn = document.getElementById("btn3");
        var handler = function () { console.log(this.id); };
        if (btn.addEventListener) {
          console.log("addEventListener");
          btn.addEventListener("click", handler, false);
        }
        else if (btn.attachEvent) {//IE9之前的版本
          console.log("attachEvent");
          btn.attachEvent("onclick",handler);
        }

在IE5-IE8 版本输出的是undefined。(此时调用的是attachement)

IE9以后的版本输出的btn3.(修复了上面的问题,增加了通用的addEventListener)。

如果想修复IE5-8里面的那个问题,可以使用下面的方法。

/*
*target:目标对象,button之类的
*type:"click"字符串事件名称,无需带on
*handler:调用的处理程序
*/
function addEvent(target,type,handler){
 if (target.addEventListener) {
          target.addEventListener(type, handler, false);
        }
        else if (target.attachEvent) {//IE9之前的版本          
          btn.attachEvent("on"+type,function(event){
            return hanlder.call(target,event);//把处理程序作为事件目标的方法调用,更改this指向。
          });
        }
}

以上所述是小编给大家介绍的在JS中通过四种设置事件处理程序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
html下载本地
Jun 19 Javascript
jQuery 技巧大全(新手入门篇)
May 12 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
Nov 07 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
vue路由懒加载的实现方法
Mar 12 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
Sep 21 Javascript
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
Javascript中async与await的捕捉错误详解
Mar 03 Javascript
JavaScript表单验证完美代码
Mar 02 #Javascript
js实现常见的工具条效果
Mar 02 #Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 #Javascript
jQuery给表格添加分页效果
Mar 02 #Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 #Javascript
Bootstrap Scrollspy源码学习
Mar 02 #Javascript
老生常谈jquery中detach()和remove()的区别
Mar 02 #Javascript
You might like
配置php网页显示各种语法错误
2013/09/23 PHP
php实现递归的三种基本方式
2020/07/04 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
vue如何将v-for中的表格导出来
2018/05/07 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Flask-WTF表单的使用方法
2019/07/12 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
《将心比心》教学反思
2014/04/08 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技