当前位置: 首页 > news >正文

事件处理程序

事件处理程序


一、事件处理程序的定义

事件处理程序是一段代码,用于响应特定的事件。在网页开发中,事件是在文档或浏览器窗口中发生的特定交互瞬间,如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数,它能让网页实现交互性和动态性。

二、事件处理程序的绑定方式

2.1 HTML 内联事件处理程序

原理:

直接在 HTML 标签中使用事件属性来绑定事件处理程序,事件属性的值是 JavaScript 代码。

示例:
<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <button onclick="alert('你点击了按钮!')">点击我</button> 
</body> 
</html> 
优缺点
  • 优点是简单直接,适合简单的交互。
  • 缺点是 HTML 和 JavaScript 代码耦合度高,不利于代码的维护和复用。

2.2 DOM0 级事件处理程序

原理:

通过 JavaScript 获取 DOM 元素,然后将一个函数赋值给元素的事件属性。

示例:
<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <button id="myButton">点击我</button> 
    <script> 
        const button = document.getElementById('myButton');  
        button.onclick  = function() { 
            alert('你点击了按钮!'); 
        }; 
    </script> 
</body> 
</html> 
优缺点:
  • 优点是兼容性好,所有浏览器都支持。
  • 缺点是一个元素的一个事件只能绑定一个处理程序,如果多次绑定,后面的会覆盖前面的。

2.3 DOM2 级事件处理程序

原理:

使用 addEventListener() 方法来绑定事件处理程序,它可以为元素的同一个事件绑定多个处理程序。

示例:
<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <button id="myButton">点击我</button> 
    <script> 
        const button = document.getElementById('myButton');  
        button.addEventListener('click',  function() { 
            alert('第一次点击响应'); 
        }); 
        button.addEventListener('click',  function() { 
            alert('第二次点击响应'); 
        }); 
    </script> 
</body> 
</html> 

上述代码,当用户点击按钮时,会依次弹出两个警告框,先显示“第一次点击响应!”,再显示“第二次点击响应!”。如果用户的意图是只让其中一个处理程序响应,那么这段代码会导致两个处理程序都被触发。

下面对事件处理逻辑进行调整

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>title</title>
</head>
<body> 
    <!-- 创建一个按钮 --> 
    <button id="myButton">点击我</button> 
 
    <script> 
        // 获取按钮元素 
        const button = document.getElementById('myButton');  
        // 初始化点击次数为 0 
        let clickCount = 0; 
 
        // 为按钮添加点击事件监听器 
        button.addEventListener('click',  function () { 
            // 点击次数加 1 
            clickCount++; 
            if (clickCount === 1) { 
                // 第一次点击时显示相应信息 
                alert('第一次点击响应'); 
            } else if (clickCount === 2) { 
                // 第二次点击时显示相应信息 
                alert('第二次点击响应'); 
            } 
        }); 
    </script> 
</body> 
</html>
优缺点:
  • 优点是可以为同一个事件绑定多个处理程序,并且可以控制事件的捕获和冒泡阶段。
  • 缺点是部分旧浏览器(如 IE8 及以下)不支持,需要使用
    attachEvent() 方法作为替代。

三、事件对象

定义:

当事件触发时,会自动创建一个事件对象,它包含了与该事件相关的信息,如事件类型、触发事件的元素、鼠标位置等。

示例:

<!DOCTYPE html> 
<html lang="en"> 
<body>
    <button id="myButton">点击我</button>
    <script>
        const button = document.getElementById('myButton');
        button.addEventListener('click', function (event) {
            console.log(' 事件类型:', event.type);  // 事件类型: click
            console.log(' 触发事件的元素:', event.target); // 触发事件的元素:<button id="myButton">点击我</button>
        }); 
    </script>
</body>
</html> 

常见事件属性和方法:

  • type:返回事件的类型,如 click、mouseover 等。
  • target:返回触发事件的元素。
  • preventDefault():阻止事件的默认行为,如阻止链接的跳转、表单的提交等。
  • stopPropagation():阻止事件的冒泡或捕获。

四、事件流

定义:

事件流:描述了事件在页面中触发的顺序,主要有事件捕获和事件冒泡两种机制。
事件捕获:事件从文档的根节点开始,依次向下查找触发事件的元素,直到找到目标元素。在这个过程中,如果元素绑定了相应的捕获阶段的事件处理程序,会依次执行。
事件冒泡:事件从目标元素开始,依次向上传播到文档的根节点。如果元素绑定了相应的冒泡阶段的事件处理程序,会依次执行。

示例:

<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <div id="outer"> 
        <div id="inner">点击我</div> 
    </div> 
    <script> 
        const outer = document.getElementById('outer');  
        const inner = document.getElementById('inner');  
 
        outer.addEventListener('click',  function() { 
            console.log(' 外层 div 冒泡阶段触发'); 
        }, false); 
        outer.addEventListener('click',  function() { 
            console.log(' 外层 div 捕获阶段触发'); 
        }, true); 
 
        inner.addEventListener('click',  function() { 
            console.log(' 内层 div 冒泡阶段触发'); 
        }, false); 
        inner.addEventListener('click',  function() { 
            console.log(' 内层 div 捕获阶段触发'); 
        }, true); 
    </script> 
</body> 
</html> 

这段代码的主要功能是展示事件在DOM中的捕获和冒泡机制。当你点击inner div时,首先会触发outer div的捕获阶段事件处理程序,然后是inner div的捕获阶段事件处理程序。接着,事件开始冒泡,首先触发inner div的冒泡阶段事件处理程序,最后是outer div的冒泡阶段事件处理程序。通过这种方式,可以控制事件处理程序的执行顺序。

五、事件委托

原理:

利用事件冒泡的原理,将事件处理程序绑定到父元素上,当子元素触发事件时,事件会冒泡到父元素上,从而触发父元素上的事件处理程序。通过判断事件的 target 属性,可以确定是哪个子元素触发了事件。

示例:

<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <ul id="myList"> 
        <li>列表项 1</li> 
        <li>列表项 2</li> 
        <li>列表项 3</li> 
    </ul> 
    <script> 
        const list = document.getElementById('myList');  
        list.addEventListener('click',  function(event) { 
            if (event.target.tagName  === 'LI') { 
                console.log(' 你点击了列表项:', event.target.textContent);  
            } 
        }); 
    </script> 
</body> 
</html> 

优缺点:

  • 优点:是可以减少事件处理程序的绑定数量,提高性能;便于动态添加和删除子元素,无需为新添加的子元素重新绑定事件处理程序。
  • 缺点:是需要对事件的 target 属性进行判断,增加了代码的复杂度。
http://www.dtcms.com/a/109686.html

相关文章:

  • 主题(topic)中使用键(key)来区分同一主题下的多个数据实例
  • 风云可测:华为AI天气大模型将暴雨预测误差缩至3公里内
  • ctfshow VIP题目限免 前台JS绕过
  • Oracle中的UNION原理
  • 【7】数据结构的队列篇章
  • 在Vue中如何高效管理组件状态
  • Swift 继承
  • Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
  • FreeRtos简介
  • LLM架构解析:词嵌入模型 Word Embeddings(第二部分)—— 从基础原理到实践应用的深度探索
  • vscode 使用ssh进行远程开发 (remote-ssh)
  • 【2】搭建k8s集群系列(二进制)之安装etcd数据库集群
  • MySQL学习笔记集--DML
  • 【北京化工大学】 神经网络与深度学习 实验6 MATAR图像分类
  • JeecgBoot AI 应用开发平台,AIGC 功能介绍
  • MCP服务器搜索引擎有哪些?MCP资源网站推荐
  • IdeaVim-AceJump
  • 【Mysql】之存储引擎详解
  • 【UVM学习笔记】更加灵活的UVM—通信
  • oracle asm 相关命令和查询视图
  • 本地部署爆款传输神器 FastSend 并实现外部访问
  • 智能巡检机器人在化工企业的应用研究
  • 针对 Python 3.7.0,以下是 Selenium 版本的兼容性建议和安装步骤
  • MTK-GMS版本国内WIFI受限问题
  • Fatal error compiling: 无效的目标发行版: 17 -> [Help 1]的解决方法
  • c++ (通用引用)和(左值引用)区别
  • 自适应信号处理任务(过滤,预测,重建,分类)
  • MAUI开发第一个app的需求解析:登录+版本更新,用于喂给AI
  • qRegisterMetaType函数使用
  • 泛微ECOLOGY9 解决文档中打开发票类PDF文件无内容的配置方法