深入理解在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 相关文章推荐
延时重复执行函数 lLoopRun.js
May 08 Javascript
JAVASCRIPT style 中visibility和display之间的区别
Jan 22 Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
May 06 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
Dec 26 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
基于JS实现bookstore静态页面的实例代码
Feb 22 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
webpack下实现动态引入文件方法
Feb 22 Javascript
在vue项目中正确使用iconfont的方法
Sep 28 Javascript
js正则匹配多个全部数据问题
Dec 20 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 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页面缓存方法小结
2015/01/10 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
业务总经理岗位职责
2014/02/03 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
高考标语大全
2014/06/05 职场文书
物理学专业求职信
2014/07/04 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
2015年超市工作总结
2015/04/09 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL