深入理解在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 相关文章推荐
nicejforms——美化表单不用愁
Feb 20 Javascript
JS location几个方法小姐
Jul 09 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
Feb 26 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
JS实现关闭当前页而不弹出提示框的方法
Jun 22 Javascript
原生js实现图片放大缩小计时器效果
Jan 20 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
js实现点击按钮复制文本功能
Jul 20 Javascript
在HTML文档中嵌入JavaScript的四种方法
May 07 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 25 Javascript
webpack的tree shaking的实现方法
Sep 18 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/12/04 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
Javascript事件实例详解
2013/11/06 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
jQuery实现的form转json经典示例
2017/10/10 jQuery
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
Python返回真假值(True or False)小技巧
2015/04/10 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
python 检查文件mime类型的方法
2018/12/08 Python
python+mysql实现教务管理系统
2019/02/20 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
Python 里最强的地图绘制神器
2021/03/01 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
环境卫生标语
2014/06/09 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android