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

发布时间 - 2026-01-10 23:22:32    点击率:

所有的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中通过四种设置事件处理程序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js设置事件处理程序  # JavaScript中的事件处理程序  # JS事件流与事件处理程序实例分析  # JavaScript常见事件处理程序实例总结  # JavaScript事件处理程序详解  # JavaScript的事件代理和委托实例分析  # js中的事件委托或是事件代理使用详解  # JavaScript事件代理和委托详解  # js事件委托和事件代理案例分享  # JavaScript通过事件代理高亮显示表格行的方法  # JS实现为动态添加的元素增加事件功能示例【基于事件委托】  # javascript事件委托的方式绑定详解  # JS事件处理机制及事件代理(事件委托)实例详解  # 的是  # 弹出  # 而非  # 这段  # 四种  # 转换为  # 小编  # 是一个  # 是在  # 有个  # 在此  # 推荐使用  # 可以通过  # 给大家  # 可以使用  # 任何一个  # 提供一个  # 它会  # 指的是  # 还用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端企业智能建站程序:SEO优化与响应式模板定制开发  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在新浪SAE免费搭建个人博客?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何快速搭建二级域名独立网站?  如何确保西部建站助手FTP传输的安全性?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何选择可靠的免备案建站服务器?  WEB开发之注册页面验证码倒计时代码的实现  浅谈redis在项目中的应用  轻松掌握MySQL函数中的last_insert_id()  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel如何使用Blade模板引擎?(完整语法和示例)  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何在橙子建站上传落地页?操作指南详解  如何在 Pandas 中基于一列条件计算另一列的分组均值  零基础网站服务器架设实战:轻量应用与域名解析配置指南  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何快速启动建站代理加盟业务?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何用已有域名快速搭建网站?  网站建设整体流程解析,建站其实很容易!  香港服务器如何优化才能显著提升网站加载速度?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  免费视频制作网站,更新又快又好的免费电影网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  HTML 中动态设置元素 name 属性的正确语法详解  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  原生JS获取元素集合的子元素宽度实例  *服务器网站为何频现安全漏洞?  js实现获取鼠标当前的位置  Laravel如何使用Vite进行前端资源打包?(配置示例)  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  装修招标网站设计制作流程,装修招标流程?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?