【JavaScript】十三、事件监听与事件类型

news2025/4/9 12:08:07

文章目录

  • 1、事件监听
    • 1.1 案例:击关闭顶部广告
    • 1.2 案例:随机点名
    • 1.3 事件监听的版本
  • 2、事件类型
    • 2.1 鼠标事件
      • 2.1.1 语法
      • 2.1.2 案例:轮播图主动切换
    • 2.2 焦点事件
      • 2.2.1 语法
      • 2.2.2 案例:模拟小米搜索框
    • 2.3 键盘事件
      • 2.3.1 语法
      • 2.3.2 回车发布评论
  • 2.4 文本事件
      • 2.4.1 语法
      • 2.4.2 案例:评论字数统计

1、事件监听

让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做为响应

  • 语法:

在这里插入图片描述

  • 示例:
<body>
    <button>按钮</button>
    <script>
        const btn = document.querySelector('button')
        // 事件类型要加引号
        // 每点击一次,执行一次函数
        btn.addEventListener('click', function () {
            alert('点击成功~')
        })
    </script>
</body>

在这里插入图片描述

监听三要素:

  • 事件源 (谁被触发了,是一个DOM对象)
  • 事件类型 (用什么方式触发,点击还是鼠标经过等)
  • 事件处理程序 (要做什么事情)

1.1 案例:击关闭顶部广告

需求:点击关闭之后,顶部关闭

思路:

  • 广告页面用一个div大盒子嵌套一个div小盒子,小盒子里放个关闭图标x
  • 点击x,隐藏大盒子,display:none 隐藏元素 display:block 显示元素
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            position: relative;
            width: 1000px;
            height: 200px;
            background-color: blue;
            margin: 100px auto;
            text-align: center;
            font-size: 50px;
            line-height: 200px;
            font-weight: 700;
        }

        .box1 {
            position: absolute;
            right: 20px;
            top: 10px;
            width: 20px;
            height: 20px;
            background-color: skyblue;
            text-align: center;
            font-size: 16px;
            line-height: 20px;
            /*鼠标箭头变为小手样式 */
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="box">
        一刀999<div class="box1">x</div>
    </div>
    <script>
        const x = document.querySelector('.box1')
        const div = document.querySelector('.box')
        x.addEventListener('click', function () {
            div.style.display = 'none'
        })
    </script>
</body>

</html>

在这里插入图片描述

1.2 案例:随机点名

思路:

  • 点名器上名字快速闪动,用定时器 + 短时间重复执行,从数组中随机选择数据渲染
  • 点击开始,打开定时器
  • 点击结束,关闭定时器,取出当前数据,并从数组中删除该数据
  • 当数组中仅剩一个数据时,不用抽了,disabled = true
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        h2 {
            text-align: center;
        }

        .box {
            width: 600px;
            margin: 50px auto;
            display: flex;
            font-size: 25px;
            line-height: 40px;
        }

        .uname {

            width: 450px;
            height: 40px;
            color: red;

        }

        .btns {
            text-align: center;
        }

        .btns button {
            width: 120px;
            height: 35px;
            margin: 0 50px;
        }
    </style>
</head>

<body>
    <h2>随机点名</h2>
    <div class="box">
        <span>名字是:</span>
        <div class="uname">即将开始随机抽</div>
    </div>
    <div class="btns">
        <button class="start">开始</button>
        <button class="end">结束</button>
    </div>

    <script>
        // 数据数组
        const arr = ['马超', '黄忠', '赵云', '关羽', '张飞', '曹操']
        // 定时器ID(全局变量)
        let timerId = 0
        // 抽中数据的索引(全局变量)
        let random

        // 获取DOM对象
        const start = document.querySelector('.start')
        const end = document.querySelector('.end')
        const uname = document.querySelector('.uname')


        // 点击开始,打开定时器
        start.addEventListener('click', function () {
            // 返回定时器ID
            timerId = setInterval(function () {
                random = Math.floor(Math.random() * arr.length)
                uname.innerHTML = arr[random]
            }, 10)  // 十毫秒刷新一次

            // 如果数组长度剩1了,那就置灰开始和结束按钮
            if (arr.length === 1) {
                start.disabled = true
                end.disabled = true
            }
        })

        // 点击关闭,清除定时器
        end.addEventListener('click', function () {
            clearInterval(timerId)
            arr.splice(random, 1)
        })
    </script>
</body>

</html>

在这里插入图片描述

1.3 事件监听的版本

  • 在DOM L0版本,语法是:事件源.on事件 = function() { }
  • 在DOM L1版本,语法是:事件源.addEventListener(事件, 事件处理函数)

前者做为早期语法,会产生覆盖,如下,绑定两次点击时间,只有第二个生效,也就是说只有一个22的弹窗,这种类似赋值覆盖,let num =1 ; num = 2

在这里插入图片描述

但DOM L1的事件监听语法,则不会覆盖,下面这么写,会有11和22两个弹窗

在这里插入图片描述

2、事件类型

在这里插入图片描述

2.1 鼠标事件

2.1.1 语法

相关事件:

  • click:鼠标点击
  • mouseenter:鼠标经过
  • mouseleave:鼠标离开

演示鼠标事件中的鼠标经过和离开:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: greenyellow;
        }
    </style>
</head>

<body>
    <!-- 空盒子 -->
    <div></div>

    <script>
        const div = document.querySelector('div')
        div.addEventListener('mouseenter', function () {
            console.log('鼠标经过···');

        })
        div.addEventListener('mouseleave', function () {
            console.log('鼠标离开...');

        })
    </script>
</body>

</html>

在这里插入图片描述

2.1.2 案例:轮播图主动切换

链接🔗:https://blog.csdn.net/llg___/article/details/146964079

2.2 焦点事件

2.2.1 语法

相关事件:

  • focus:获得焦点(获得光标)
  • blur:失去焦点(失去光标)

示例:

<body>
    <input type="text">
    <script>
        const input = document.querySelector('input')
        input.addEventListener('focus', function () {
            console.log('获得焦点');

        })
        input.addEventListener('blur', function () {
            console.log('失焦了');

        })
    </script>
</body>

效果:

在这里插入图片描述

2.2.2 案例:模拟小米搜索框

模拟小米搜索框,搜索框获得焦点时,显示可能搜索词汇且搜索框高亮

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        ul {

            list-style: none;
        }

        .mi {
            position: relative;
            width: 223px;
            margin: 100px auto;
        }

        .mi input {
            width: 223px;
            height: 48px;
            padding: 0 10px;
            font-size: 14px;
            line-height: 48px;
            border: 1px solid #e0e0e0;
            outline: none;
        }

        .mi .search {
            border: 1px solid #ff6700;
        }

        .result-list {
            display: none;
            position: absolute;
            left: 0;
            top: 48px;
            width: 223px;
            border: 1px solid #ff6700;
            border-top: 0;
            background: #fff;
        }

        .result-list a {
            display: block;
            padding: 6px 15px;
            font-size: 12px;
            color: #424242;
            text-decoration: none;
        }

        .result-list a:hover {
            background-color: #eee;
        }
    </style>

</head>

<body>
    <div class="mi">
        <input type="search" placeholder="小米笔记本">
        <ul class="result-list">
            <li><a href="#">全部商品</a></li>
            <li><a href="#">小米11</a></li>
            <li><a href="#">小米10S</a></li>
            <li><a href="#">小米笔记本</a></li>
            <li><a href="#">小米手机</a></li>
            <li><a href="#">黑鲨4</a></li>
            <li><a href="#">空调</a></li>
        </ul>
    </div>
    <script>
        const input = document.querySelector('[type=search]')  //CSS的属性选择器
        const ul = document.querySelector('.result-list')

        // 获得焦点
        input.addEventListener('focus', function () {
            // 展示下拉框数据
            ul.style.display = 'block'
            // 让搜索框边线变黄
            input.classList.add('search')
        })

        // 失去焦点
        input.addEventListener('blur', function () {
            ul.style.display = 'none'
            input.classList.remove('search')

        })




    </script>
</body>

</html>

获得焦点效果:

在这里插入图片描述

失去焦点效果:

在这里插入图片描述

2.3 键盘事件

2.3.1 语法

相关事件:

  • keydown:键盘按下触发

  • keyup:键盘抬起触发

  • 示例:

<body>
    <input type="text">
    <script>
        const input = document.querySelector('input')
        input.addEventListener('keydown', function () {
            console.log('键盘按下了');

        })
        input.addEventListener('keyup', function () {
            console.log('键盘弹起了');

        })
    </script>
</body>

效果:按下Enter并松开,算两个事件,一个按下 + 一个弹起
在这里插入图片描述

2.3.2 回车发布评论

链接🔗:

2.4 文本事件

2.4.1 语法

相关事件:

  • input:用户输入事件

示例:

<body>
    <input type="text">
    <script>
        const input = document.querySelector('input')
        input.addEventListener('input', function () {
            console.log(`用户输入的内容:${input.value}`);

        })
    </script>
</body>

注意,获取这个输入值,用value属性

在这里插入图片描述

2.4.2 案例:评论字数统计

<body>
    <div class="wrapper">
        <i class="avatar"></i>
        <textarea id="tx" placeholder="发一条友善的评论" rows="2" maxlength="200"></textarea>
    </div>
    <div class="wrapper">
        <span class="total">0/200</span>
    </div>

    <script>
        const tx = document.querySelector('#tx')
        const total = document.querySelector('.total')

        // 实现获得焦点就显示评论的字数,失焦则隐藏字数计算
        tx.addEventListener('focus', function () {
            total.style.opacity = 1     // opacity,透明度样式,相比display,显示和隐藏更加柔和
        })
        tx.addEventListener('blur', function () {
            total.style.opacity = 0
        })

        tx.addEventListener('input', function () {
            // tx.value是获取到输入的字符串,后面.length获取字符串长度(包装类型)
            total.innerHTML = `${tx.value.length}/200字`
        })
    </script>

</body>

效果:

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过ansible+docker-compose快速安装一主两从redis+三sentinel

目录 示例主机列表 架构参考 文件内容 安装脚本 ansible变量&#xff0c;需修改 ansible配置文件和主机清单&#xff0c;需修改 运行方式 验证故障转移master 涉及redis镜像和完整的脚本文件 示例主机列表 架构参考 文件内容 安装脚本 #!/bin/bashset -e export pa…

mysql docker容器启动遇到的问题整理

好几个月没折腾mysql的部署&#xff0c;弄了下&#xff0c;又遇到不少问题 问题一&#xff1a;Access denied for user ‘root‘‘172.18.0.1‘ docker容器启动后&#xff0c;本地navicat 连接报这个错误 查到两个方案&#xff0c;一个貌似是要让root用户能在任意ip地址&…

长短期记忆神经网络(LSTM)基础学习与实例:预测序列的未来

目录 1. 前言 2. LSTM的基本原理 2.1 LSTM基本结构 2.2 LSTM的计算过程 3. LSTM实例&#xff1a;预测序列的未来 3.1 数据准备 3.2 模型构建 3.3 模型训练 3.4 模型预测 3.5 完整程序预测序列的未来 4. 总结 1. 前言 在深度学习领域&#xff0c;循环神经网络&…

C++多继承

可以用多个基类来派生一个类。 格式为&#xff1a; class 类名:类名1,…, 类名n { private: … &#xff1b; //私有成员说明; public: … &#xff1b; //公有成员说明; protected: … &#xff1b; //保护的成员说明; }; class D: public A, protected B, private C { …//派…

【深度学习新浪潮】DeepSeek近期的技术进展及未来动向

一、近期技术进展 模型迭代与性能提升 DeepSeek-V3-0324版本更新:2025年3月24日发布,作为V3的小版本升级,参数规模达6850亿,采用混合专家(MoE)架构,激活参数370亿。其代码能力接近Claude 3.7,数学推理能力显著提升,且在开源社区(如Hugging Face)上线。DeepSeek-R1模…

工业4.0时代下的人工智能新发展

摘要&#xff1a;随着德国工业4.0时代以及中国制造2025的提出&#xff0c;工业智能化的改革的时代正逐渐到来&#xff0c;然而我国整体工业水平仍然处于工业2.0水平。围绕工业4.0中智能工厂、智能生产、智能物流这三大主题&#xff0c;结合国内外研究现状&#xff0c;对人工智能…

监控易一体化运维:高性能与易扩展,赋能运维新高度

在当今数字化时代&#xff0c;云技术、大数据、智慧城市等前沿科技蓬勃发展&#xff0c;企业和城市对 IT 基础设施的依赖程度与日俱增。在这样的大环境下&#xff0c;运维系统的高性能与易扩展性对于保障业务稳定运行和推动发展的关键意义。今天&#xff0c;为大家深入剖析监控…

机器学习stats_linregress

import numpy as np from scipy import stats# r stats.linregress(xs, ys) 是一个用于执行简单线性回归的函数&#xff0c;通常来自 scipy.stats 库。# 具体含义如下&#xff1a;# stats.linregress&#xff1a;执行线性回归分析&#xff0c;拟合一条最佳直线来描述两个变量 …

Linux系统01---指令

目录 学习的方法 Linux 系统介绍 2.1 Unix 操作系统&#xff08;了解&#xff09; 2.2 Linux 操作系统&#xff08;了解&#xff09; 2.3 Linux 操作系统的主要特性&#xff08;重点&#xff09; 2.4 Linux 与 Unix 的区别与联系 2.5 GUN 与 GPL&#xff08;了解&#…

【蓝桥杯14天冲刺课题单】Day 8

1.题目链接&#xff1a;19714 数字诗意 这道题是一道数学题。 先考虑奇数&#xff0c;已知奇数都可以表示为两个相邻的数字之和&#xff0c;2k1k(k1) &#xff0c;那么所有的奇数都不会被计入。 那么就需要考虑偶数什么情况需要被统计。根据打表&#xff0c;其实可以发现除了…

DeepSeek 开源的 3FS 如何?

DeepSeek 3FS&#xff08;Fire-Flyer File System&#xff09;是一款由深度求索&#xff08;DeepSeek&#xff09;于2025年2月28日开源的高性能并行文件系统&#xff0c;专为人工智能训练和推理任务设计。以下从多个维度详细解析其核心特性、技术架构、应用场景及行业影响&…

通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理

什么是Overlay网络, 用于解决什么问题 ? Overlay网络通过在现有网络之上创建一个虚拟网络层, 解决不同主机的容器之间相互通信的问题 如果没有Overlay网络&#xff0c;实现跨主机的容器通信通常需要以下方法&#xff1a; 端口映射使用宿主机网络模式 这些方法牺牲了容器网络…

HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析

文章目录 一、前言二、判断题&#xff08;134道&#xff09;三、单选题&#xff08;210道&#xff09;四、多选题&#xff08;123道&#xff09;五、拓展阅读 一、前言 鸿蒙原生技能学习阶段&#xff0c;通过官方认证的资格十分有必要&#xff0c;在项目实战前掌握基础开发理论…

MSVC编译遇到C2059、C2143、C2059、C2365、C2059等错误的解决方案

MSVC编译时&#xff0c;遇到如下错误&#xff1a; c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\msxml.h(1842): error C2059: 语法错误:“常数” [D:\jenkins_home\workspace\xxx.vcxproj] c:\program files (x86)\windows kits\10\include\10.0.18362.0…

AI重塑云基础设施,亚马逊云科技打造AI定制版IaaS“样板房”

AI正在彻底重塑云基础设施。 IDC最新《2025年IDC MarketScape&#xff1a;全球公有云基础设施即服务&#xff08;IaaS&#xff09;报告》显示&#xff0c;AI正在通过多种方式重塑云基础设施&#xff0c;公有云IaaS有望继续保持快速增长&#xff0c;预计2025年全球IaaS的整体规…

Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务

目录 一.systemctl 管理服务 1.systemctl管理 2.设置服务卡机自启动或开机不启动 二.编译安装配置文件编写使得可以使用systemctl管理 1、编写配置文件原因 2、添加配置文件实现systemctl管理服务 一.systemctl 管理服务 1.systemctl管理 基本格式&#xff1a; systemc…

【NLP 52、多模态相关知识】

生活应该是美好而温柔的&#xff0c;你也是 —— 25.4.1 一、模态 modalities 常见&#xff1a; 文本、图像、音频、视频、表格数据等 罕见&#xff1a; 3D模型、图数据、气味、神经信号等 二、多模态 1、Input and output are of different modalities (eg&#xff1a; tex…

Element Plus 常用组件

2025/4/1 向全栈工程师迈进&#xff01;&#xff01;&#xff01; 常见Element Plus组件的使用&#xff0c;其文章中“本次我使用到的按钮如下”是我自己做项目时候用到的&#xff0c;记录以加强记忆。阅读时可以跳过。 一、Button按钮 1.1基础按钮 在element plus中提供的按…

2025年优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO)

真菌生长优化算法(Fungal Growth Optimizer&#xff0c;FGO) 是发表在中科院一区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;6.7&#xff09;的2025年3月智能优化算法 01.引言 Fungal Growth Optimizer (FGO) 是一种基于真菌生长行为的元启发式优化算法…

阿里通义千问发布全模态开源大模型Qwen2.5-Omni-7B

Qwen2.5-Omni 是一个端到端的多模态模型&#xff0c;旨在感知多种模态&#xff0c;包括文本、图像、音频和视频&#xff0c;同时以流式方式生成文本和自然语音响应。汇聚各领域最先进的机器学习模型&#xff0c;提供模型探索体验、推理、训练、部署和应用的一站式服务。https:/…