0

0

JavaScript事件解析

小云云

小云云

发布时间:2018-02-11 11:24:38

|

1508人浏览过

|

来源于php中文网

原创

事件是在编程时系统内发生的动作或者发生的事情. 系统通过它来告诉编程者,在编程者愿意的情况下,编程者一某种方式对它做出回应.本文主要和大家分享JavaScript事件解析,希望能帮助到大家。

添加事件方式

元素属性

<span style="font-size: 14px;">var btn = document.querySelector('button');<br/><br/>btn.onclick = function() {<br/>  var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';<br/>  document.body.style.backgroundColor = rndCol;<br/>}<br/><br/>或者<br/><br/>var btn = document.querySelector('button');<br/><br/>function bgChange() {<br/>  var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';<br/>  document.body.style.backgroundColor = rndCol;<br/>}<br/><br/>btn.onclick = bgChange<br/></span>

行内事件

<span style="font-size: 14px;"><button onclick="bgChange()">Press me</button><br/><br/>function bgChange() {<br/>  var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';<br/>  document.body.style.backgroundColor = rndCol;<br/>}<br/><br/>或者<br/><br/><button onclick="alert('Hello, this is my old-fashioned event handler!');">Press me</button><br/></span>

注册事件监听

<span style="font-size: 14px;">addEventListener()和removeEventListener();<br/><br/>btn.addEventListener('click', function() {<br/>  var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';<br/>  document.body.style.backgroundColor = rndCol;<br/>});<br/><br/>或者<br/><br/>btn.removeEventListener('click', bgChange);<br/></span>

优缺点

  • 元素属性

<span style="font-size: 14px;">优:<br/>     1. 兼容性好<br/>     2. 行为的分离<br/>     3.便于操作当事对象,因为function是作为on***的属性出现的,可直接用this引用当事对象<br/>缺: <br/>     1. 给同一个监听器注册多个处理器,后面的会覆盖前面<br/>     btn.onclick=function(){alert('a')};<br/>     btn.onclick=function(){alert('b')};<br/></span>
  • 行内事件

<span style="font-size: 14px;">优:<br/>     1. 兼容性好,是最早的事件处理方法<br/>     2. 方便快捷<br/>缺: <br/>     1. 代码杂糅<br/>     2. 难以管理和效率低下,一个按钮看起来还好,但是如果有一百个按钮呢?得在文件中加上100个属性<br/>     3. 文档很难解析<br/></span>
  • 注册事件监听

<span style="font-size: 14px;">优:<br/>     1. 它允许为事件添加多个单独的处理程序。这对于DHTML库或Mozilla扩展尤其有用,即使使用其他库/扩展也需要很好的工作<br/>     2. 它可以让你更好地控制阶段,当听者被激活(捕获与冒泡)<br/>     3. 它适用于任何DOM元素,而不仅仅是HTML元素<br/>     4. 行为的分离 <br/>缺:<br/>    兼容性(不过网上有很多成熟的hack);<br/></span>

事件对象

具体请看event详解-https://developer.mozilla.org

  • 在触发DOM上的某个事件时,会在事件处理程序函数中会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息.

    立即学习Java免费学习笔记(深入)”;

<span style="font-size: 14px;">var btn = document.getElementById("myBtn");<br/>btn.onclick = function(event) {<br/>    alert(event.type); //"click"<br/>}<br/>btn.addEventListener("click", function(event) {<br/>    alert(event.type); //"click"<br/>}, false);<br/></span>

event.currentTarget与event.target

<span style="font-size: 14px;">事件对象event的target属性始终是事件刚刚发生的元素的引用<br/></span>
  • 例如,你可能有一组16块方格,当它们被点击时就会消失。用e.target总是能准确选择当前操作的东西(方格)并执行操作让它消失,而不是必须以更困难的方式选择它.

<span style="font-size: 14px;">var ps = document.querySelectorAll('p');<br/><br/>for (var i = 0; i < ps.length; i++) {<br/>  ps[i].onclick = function(e) {<br/>    e.target.style.backgroundColor = bgChange();<br/>  }<br/>}<br/></span>

阻止默认行为(event.preventDefault())

  • 有时,你会遇到一些情况,你希望事件不执行它的默认行为例如自定义注册表单

<span style="font-size: 14px;">var form = document.querySelector('form');<br/>var fname = document.getElementById('fname');<br/>var lname = document.getElementById('lname');<br/>var submit = document.getElementById('submit');<br/>var para = document.querySelector('p');<br/>form.onsubmit = function(e) {<br/>  if (fname.value === '' || lname.value === '') {<br/>    e.preventDefault();<br/>    para.textContent = 'You need to fill in both names!';<br/>  }<br/>}<br/></span>

事件冒泡及捕获(event.stopPropagation())

<span style="font-size: 14px;">描述事件触发时序问题的术语。<br/>事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。<br/>事件冒泡是自下而上的去触发事件。<br/>绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡<br/></span>

JavaScript事件解析

事件委托

<span style="font-size: 14px;">冒泡还允许我们利用事件委托——这个概念依赖于这样一个事实,如果你想要在大量子元素中单击任何一个都可以运行一段代码,您可以将事件监听器设置在其父节点上,并将事件监听器气泡的影响设置为每个子节点,而不是每个子节点单独设置事件监听器<br/></span>

如:鼠标放到li上对应的li背景变灰

<span style="font-size: 14px;"><ul><br/>    <li>item1</li><br/>    <li>item2</li><br/>    <li>item3</li><br/>    <li>item4</li><br/>    <li>item5</li><br/>    <li>item6</li><br/></ul><br/></span>
  • 利用事件冒泡实现

<span style="font-size: 14px;">$("ul").on("mouseover",function(e){<br/>     $(e.target).css("background-color","#ddd").siblings().css("background-color","white");<br/>})<br/></span>
  • 给所有li都绑上事件

<span style="font-size: 14px;">$("li").on("mouseover",function(){<br/>      $(this).css("background-color","#ddd").siblings().css("background-color","white");<br/>})<br/></span>
<span style="font-size: 14px;">代码简洁程度上,两者是相若仿佛的。<br/>前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的<br/>如果在绑定事件完成后,页面又动态的加载了一些元素<br/>第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件.<br/></span>

自定义事件(DOM的事件模拟又称“伪DOM自定义事件”)

  • js原生自定义事件分三个阶段(创造、初始化、触发)

摘自 https://developer.mozilla.org...

(1). 创造

巧文书
巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

下载
<span style="font-size: 14px;">var event = document.createEvent(type);<br/>type:是一个字符串,表示要创建的事件类型。事件类型可能包括是一个字符串,表示要创建的事件类型。<br/>事件类型可能包括"UIEvents", "MouseEvents", "MutationEvents", 或者 "HTMLEvents"<br/></span>

(2) 初始化

<span style="font-size: 14px;">event.initEvent('build', true, true);<br/>于初始化通过DocumentEvent接口创建的Event的值。支持三个参数:initEvent(eventName, canBubble,preventDefault)<br/>分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作<br/></span>

(3). 触发

<span style="font-size: 14px;">elem.dispatchEvent(event);<br/>参数event表示事件对象,是createEvent()方法返回的创建的Event对象<br/></span>

监听方法

<span style="font-size: 14px;">elem.addEventListener('build', function (e) {<br/>// e.target matches elem<br/>}, false);<br/></span>
  • jq自定义dom事件

(1). trigger()

<span style="font-size: 14px;">常用模拟<br/>  模拟方法操作<br/>   $("#btn").trigger("click");<br/>     或者    <br/>   $("#btn").click();<br/></span>
<span style="font-size: 14px;">自定义事件<br/>   $("#btn").on("myClick", function () {<br/>       $("#test").append("<p>我的自定义事件。</p>");<br/>    });    <br/>   $("btn").trigger("myClick");<br/></span>
<span style="font-size: 14px;">传递数据<br/>  trigger(tpye[,datea]);<br/>  第一个参数是要触发的事件类型,<br/>  第二个单数是要传递给事件处理函数的附加数据,以数组形式传递。<br/>  通常可以通过传递一个参数给回调函数来区别这次事件是代码触发的还是用户触发的<br/>   $("#btn").bind("clickCustomize", function (event, message1, message2) { //获取数据<br/>        $("#test").append("p" + message1 + message2 + "</p>");<br/>   });<br/>   $("#btn").trigger("clickCustomize",["我的自定义","事件"]); //传递两个数据<br/>   $(“#btn”).trigger(“clickCustomize”,["我的自定义","事件"]); //传递两个数据<br/></span>

(2). triggerHandler();(阻止默认事件)

<span style="font-size: 14px;">triggerHandler("lickCustomize");<br/></span>
  • DOM自定义事件优势与劣势:

(1)、优势:

<span style="font-size: 14px;">1、自定义事件完全由我们控制触发时机,这就意味着实现了一种 JavaScript 的解耦。我们可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好<br/>2、既然绑定也可以解绑,如果不需要了,直接移除绑定事件<br/></span>

(2)、劣势

<span style="font-size: 14px;">1、兼容性差,要自己hack(jq除外)<br/></span>

相关推荐:

JavaScript事件处理程序详解

Javascript事件与鼠标坐标的属性

JavaScript事件学习之事件流、处理程序和对象总结

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

18

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

15

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

1

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

1

2026.02.25

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

9

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

6

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

5

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.1万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号