深入理解在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 相关文章推荐
javascript操作文本框readOnly
May 15 Javascript
jQuery实现id模糊查询的小例子
Mar 19 Javascript
jquery表格内容筛选实现思路及代码
Apr 16 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
JS实现Select的option上下移动的方法
Mar 01 Javascript
JavaScript每天必学之事件
Sep 18 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 Javascript
浅谈实现在线预览PDF的几种解决办法
Aug 10 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
img的onload的另类用法
2008/01/10 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
python中sleep函数用法实例分析
2015/04/29 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python中模块string.py详解
2017/03/12 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
幼师专业求职推荐信
2013/11/08 职场文书
中学教师自我鉴定
2014/02/07 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
环保倡议书范文
2014/05/12 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
拖欠货款起诉状
2015/05/20 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers