JavaScript 事件处理

一、简介

​ 事件:发生在HTML元素上的事情,可以是用户的行为,也可以是浏览器的行为,如

  • 用户点击了某个HTML元素
  • 用户将鼠标移动到某个HTML元素上
  • 用户输入数据时光标离开
  • 页面加载完成

事件源:事件触发的源头,即触发事件的元素,如按钮、输入框、超链接等

事件对象:当一个事件发生时,这个事件相关的详细信息会被保存到一个对象中,称为event对象

事件监听:监听事件的发生,绑定事件函数,当事件被触发后执行该事件函数,即回调函数

二、绑定事件

​ 三种方式:

  • 静态绑定,通过为标签的事件属性赋值
<head>    
    <script>
        function f1(){
            console.log("静态绑定");
        }
    </script>
</head>
<body>
    <!--方式1:通过标签的事件属性-->
    <button onclick="f1()">按钮1</button>
</body>
  • 动态绑定,通过为DOM对象的事件属性赋值
<head>
   <script>
        //当页面加载完成后执行
        window.onload=function(){
            var btn2=document.getElementById("btn2");
            //方式2:通过DOM对象的事件属性,为按钮绑定点击事件
            btn2.onclick=function(){
                console.log("动态绑定");
            }
        }
    </script>
</head>
<body>
    <button id="btn2">按钮2</button>
</body>
  • 动态绑定,通过为DOM对象进行事件监听,使用addEventListene("事件名",回调函数)
<head>   
   <script>
        //当页面加载完成后执行
        window.onload=function(){
            //方式3:通过为DOM对象进行事件监听addEventListener
            var btn3=document.getElementById("btn3");
            btn3.addEventListener("click",function(){
                console.log("动态绑定");
            });
           
        }
    </script>
</head>
<body>
    <button id="btn3">按钮3</button>
</body>

 注意:

  • 可以通过事件回调函数的第一个参数获取事件对象event,属性含义:
    target      事件的目标元素,即事件源
    type            事件类型
    timeStamp   事件生成的日期和时间
    clientX     当事件被触发时,鼠标指针的水平坐标
    clientY     当事件被触发时,鼠标指针的垂直坐标
  • 在事件回调函数中,this表示事件源,即发生事件的元素 
<head>
     <script>
        //当页面加载完成后执行
        window.onload=function(){
            var btn=document.getElementById("btn");
            btn.onclick=function(event){//事件触发时会自动为回调函数传入一个参数,表示event事件对象
                console.log(111);
                console.log(event);
                console.log(typeof event);
                console.log(event.target);//事件源
                console.log(event.type);//事件类型
                console.log(this);//事件源,等同于console.log(event.target);
            }
        }
        function f1(event){
           console.log(event);
        }
    </script>
</head>
<body>
    <button id="btn">点我</button>
    <!--静态绑定事件时,需要在绑定事件回调函数时接收事件对象参数-->
    <button onclick="f1(event)">click me</button>
</body>

 三、常用事件

1、鼠标事件

事件名描述
onclick鼠标单击
ondblclick鼠标双击
onmouseover鼠标移到某元素之上
onmouseout鼠标从某元素上移开
onmousedown鼠标按钮被按下
onmouseup鼠标按键被松开
onmousemove鼠标被移动
oncontextmenu鼠标右键单击
<head>
     <script>
        window.onload=function(){
            var btn=document.getElementById("btn");
            //鼠标事件
            //btn.onclick=function(){}//鼠标单击
            //btn.ondblclick=function(){}//鼠标双击
            /*btn.onmouseover=function(){//鼠标经过
                console.log(111);
            }
            btn.onmouseout=function(){//鼠标离开
                  console.log(222);
            }
            btn.onmousedown=function(){//鼠标按下
                console.log(111);
            }
            btn.onmouseup=function(){//鼠标松开
                  console.log(222);
            }
            btn.onmousemove=function(){//鼠标移动
                console.log(111);
            }*/
            btn.oncontextmenu=function(){//鼠标右击
                console.log(111);
            }
        }
    </script>
</head>
<body>
    <button id="btn">点我</button>
</body>

2、键盘事件

事件名描述
onkeydown某个键盘的键被按下去
onkeypress某个键盘的键被按下去且松开
onkeyup某个键盘的键被松开
<head>     
     <script>
          //键盘事件
            var username=document.getElementById("username");
            username.onkeydown=function(e){//键盘的键被按下去
                //console.log(111);
                //console.log(e.keyCode);//获取按键码
                if(e.keyCode==13){//当输入回车后才会输出111(回车键码是13)
                    console.log(111);
                }
            }
            /*username.onkeypress=function(){//键盘的键被按下去且松开
                console.log(222);
            }
            username.onkeyup=function(){//键盘的键被松开
                console.log(333);
            }*/
            
        }
    </script>
</head>
<body>
    用户名:<input type="text" id="username"> 
</body>

3、表单事件

事件名描述
onfocus元素获得焦点
onblur元素失去焦点
onchange域的内容发生改变,一般用于文件选择器和下拉列表
onselect文本内容被选中
onsubmit表单提交前触发,回调函数返回true表示允许表单提交,返回false表示阻止表单提交

表单元素的方法:focus()、blur()、select()、click()

<head>
    <style>
        #username,#email{
            outline: 0;
        }
        .border{
            border: 1px solid red;

        }
        #img{
            width:100px;
            height:100px;
        }
        #head{
            display:none;
        }
        /*被选中的内容为红色*/
        /*#email::selection{
            color:red;
        }*/
    </style>
    <script>
        //表单事件
        window.onload=function(){
            var username=document.getElementById("username");
            username.onfocus=function(){//元素获得焦点
                username.classList.add("border");
            }
            username.onblur=function(){//元素失去焦点
                username.classList.remove("border");
            }
            document.getElementById("eat").onchange=function(){//域的内容发生改变
                console.log(this.checked);//获取是否选中
            }
            document.getElementById("head").onchange=function(){
                //console.log(this.files);//获取选择的文件数据
                document.getElementById("img").src=window.URL.createObjectURL(this.files[0]);//根据选中的图片改src
            }
            document.getElementById("email").onselect=function(){//文本内容被选中
                 this.classList.add("border");
            }
            document.getElementById("frm").onsubmit=function(){
                //判断表单内容是否符合要求
                var email=document.getElementById("email").value;
                if(email==""){
                    return false;
                }
                return true;
            }

        }

    </script>
</head>
<body>
    <form action="" id="frm">
        用户名:<input type="text" id="username"><br>
        爱好:<input type="checkbox" name="hobby" id="eat" value="eat">吃饭<br>
        头像:<input type="file"  id="head" multiple><!--可同时选多个文件-->
        <label for="head">
            <img src="./默认头像.png" id="img">
        </label><br>
        邮箱:<input type="text" id="email" value="tom@sina.com.cn" name="email"><br>
        <input type="submit" value="提交">
    </form>
</body>

四、事件操作

1、事件流

概念:当一个HTML元素产生事件时,该事件会在当前元素与根元素之间按特定的顺序传播,所有经过的节点都会收到该事件并执行,这个传播过程就是DOM事件流。

​ 分类:事件冒泡、事件捕获

2、事件冒泡/事件捕获

事件冒泡:当一个元素上的事件被触发时,事件从事件源开始,往上冒泡直到页面的根元素,这一过程被称为事件冒泡(默认方式)

事件捕获:当一个元素上的事件被触发时,事件从页面的根元素开始,往下直到事件目标元素,这一过程被称为事件捕获

阻止事件冒泡 :event.stopPropagation()

<head>
     <style>
        div{
            border:1px solid black;
        }
        #div1{
            width:200px;
            height:200px;
        }
        #div2{
            width:150px;
            height:150px;
        }
        #div3{
            width:100px;
            height:100px;
        }
        #div4{
            width:50px;
            height:50px;
        }
    </style>
    <script>
        function $(id){
            return document.getElementById(id);
        }
        window.onload=function(){
            $("div1").addEventListener("click",function(){
                console.log("div1");
            },false)//第三个参数为true表示采用事件捕获,默认为false表示事件冒泡
            $("div2").addEventListener("click",function(){
                console.log("div2");
            },false)
            $("div3").addEventListener("click",function(event){
                console.log("div3");
                event.stopPropagation();//阻止事件传播
            },false)
            $("div4").addEventListener("click",function(){
                console.log("div4");
            },false)
        };
    </script>
</head>
<body>
    <div id="div1" onclick="print(' div1' )">div1
        <div id="div2" onclick="print(' div2' )">div2
            <div id="div3" onclick="print(' div3' )">div3
                <div id="div4" onclick="print(' div4' )">div4</div>
            </div>
        </div>
    </div>
</body>

 3、事件代理/事件委托

​ 概念:利用事件冒泡/事件捕获机制,通过给父元素绑定事件,从而实现对所有子元素的事件管理,无需为每个子元素绑定事件

​ 优点:1.减少事件注册,降低内存占用

​            2.新增元素时实现动态绑定事件

<head>     
     <style>
        ul{
            border:1px solid #ccc;
        }
        li{
            background: pink;
        }
    </style>
    <script>
        window.onload=function(){
            /*var lis=document.querySelectorAll("li");
            for(var li of lis){
                li.onclick=function(){
                    console.log(this);//事件源
                    console.log(this,innerText);
                }
            }*/
           document.querySelector('ul').onclick=function(e){
            console.log(e.target.innerText);
            //console.log(e.target);//触发事件的原始对象
            console.log(this);
           }
        }
        function add(){
            var li=document.createElement("li");
            li.innerText="li6";
            /*li.onclick=function(){
                    console.log(this,innerText);
                }*/
            document.querySelector('ul').appendChild(li);
        }
    </script>
</head>
<body>

    <button onclick="add()">添加li</button>
    <ul>
        <li>li1</li>
        <li>li2</li>
        <li>li3</li>
        <li>li4</li>
        <li>li5</li>
    </ul>
</body>

4、事件默认行为

​ 概念:当一个事件发生时浏览器自己会默认做的事情,如:点击链接时默认会跳转,右键点击时默认会弹出菜单

​ 阻止事件的默认行为:e.preventDefault();

<head> 
    <script>
        function print(e){
            console.log(111);
            e.preventDefault();//阻止事件的默认行为
        }

    </script>
</head>
<body>
    <button oncontextmenu="print(event)">右键点击</button><br>
    <a href="https://www.baidu.com" onclick="print(event)">百度</a>
    <!--<a href="JavaScript:print()">百度</a>-->
</body>

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识|智能网联汽车多域电子电气架构会如何发展?

摘要&#xff1a;随着汽车智能化和网联化技术的快速发展&#xff0c;传统的电子电气架构已经无法满足未来车路云网一体化发展的新需求。本文聚焦于未来智能网联汽车的多域电子电气架构&#xff0c;并从总体设计、硬件系统、通信系统和软件系统四个方面对现有技术进行了详细的综…

STL-vector练习题

118. 杨辉三角 思路&#xff1a; 杨辉三角有以下性质使我们要用到的&#xff1a; ● 每行数字左右对称&#xff0c;由 1 开始逐渐变大再变小&#xff0c;并最终回到 1。 ● 第 n 行&#xff08;从 0 开始编号&#xff09;的数字有 n1 项&#xff0c;前 n 行共有 2n(n1)个数。…

使用ShardingSphere实现MySql的分库分表

目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候&#xf…

基于UDP的简易网络通信程序

目录 0.前言 1.前置知识 网络通信的大致流程 IP地址 端口号&#xff08;port&#xff09; 客户端如何得知服务器端的IP地址和端口号&#xff1f; 服务器端如何得知客户端的IP地址和端口号&#xff1f; 2.实现代码 代码模块的设计 服务器端代码 成员说明 成员实现 U…

2024 年 GitLab Global DevSecOps 报告解读

近日 GitLab 正式发布了 2024 年 GitLab Global DevSecOps 报告&#xff0c;报告主题为 What’s next in DevSecOps。在全球有超 5000 位 IT 人员参与了该报告的调研&#xff0c;超 70% 为企业管理者&#xff0c;50% 以上的受访者所在企业规模超过 500人。该报告深刻揭示了在 A…

Andrej Karpathy谈AI未来:自动驾驶、Transformer与人机融合

引言 在人工智能领域&#xff0c;Andrej Karpathy 是一个无法忽视的名字。从他早期在 OpenAI 的工作&#xff0c;到后来担任 Tesla 的 AI 主管&#xff0c;他在自动驾驶、深度学习等方面的贡献广为人知。最近&#xff0c;卡帕西做客了著名的播客节目 No Priors&#xff0c;他在…

鸿蒙开发基础

页面跳转 了解代码初始结构 /*** 装饰器&#xff1a;用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。* Entry&#xff1a;表示该自定义组件为入口组件 * Component&#xff1a;表示自定义组件* State&#xff1a;表示组件中的状态变量&#xff0c;状态变量变…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

接口测试(十二)

一、前台、后台、数据库三者关系 fiddler抓包是抓取客户端 --> 服务端 发送的的请求接口 开N个网页&#xff0c;只要有对后端发送请求&#xff0c; fiddler是无差别抓取 F12只抓取当前页面的数据 二、接口概念 接口是什么&#xff1f;— 传递数据的通道 测试系统组件间接口…

五、(JS)window中的定时器

一、为什么叫做window中的定时器 我们在全局中会用到一些函数&#xff0c;比如说alert函数&#xff0c;prompt函数&#xff0c;setTimeout等等 我们有在这里定义过这些函数吗&#xff1f;很明显没有。可见我们这些函数都是来自于window。 所以还可以写成window.setTimeout。…

AtCoder Beginner Contest 371

A - Jiro &#xff1a; 题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL ; typedef pair<int,int> PII;void solve() {string a,b, c;cin>>a>>b>>c;string s(3,a);s[0]a[0];s[1]b[0];s[2…

Java集合(八股)

这里写目录标题 Collection 接口List 接口ArrayList 简述 1. ArrayList 和 LinkedList 区别&#xff1f;⭐️⭐️⭐️⭐️2. ArrayList 和 Array 的区别&#xff1f;⭐️⭐️⭐️ArrayList 和 Vector 区别&#xff1f;⭐️⭐️ArrayList 的扩容机制&#xff1f;⭐️⭐️⭐️ Qu…

18063 圈中的游戏

### 思路 1. 创建一个循环链表表示围成一圈的 n 个人。 2. 从第一个人开始报数&#xff0c;每报到 3 的人退出圈子。 3. 重复上述过程&#xff0c;直到只剩下一个人。 4. 输出最后留下的人的编号。 ### 伪代码 1. 创建一个循环链表&#xff0c;节点表示每个人的编号。 2. 初始…

Vue3+TS项目封装一个公共的el-table组件二次封装

前言 支持动态传入列&#xff0c;列内容可以指定插槽&#xff0c;指定格式化显示 样式没太写&#xff0c;主要分享基础功能封装 效果 Table组件代码BaseTable.vue <template><el-table :data"data" border><template v-for"col in columns&q…

通过防火墙分段增强网络安全

什么是网络分段‌ 随着组织规模的扩大&#xff0c;管理一个不断扩大的网络成为一件棘手的事情&#xff0c;同时确保安全性、合规性、性能和不间断的运行可能是一项艰巨的任务。为了克服这一挑战&#xff0c;网络管理员部署了网络分段&#xff0c;这是一种将网络划分为更小且易…

react18基础教程系列-- 框架基础理论知识mvc/jsx/createRoot

react的设计模式 React 是 mvc 体系&#xff0c;vue 是 mvvm 体系 mvc: model(数据)-view(视图)-controller(控制器) 我们需要按照专业的语法去构建 app 页面&#xff0c;react 使用的是 jsx 语法构建数据层&#xff0c;需要动态处理的的数据都要数据层支持控制层: 当我们需要…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

PMBOK® 第六版 定义活动

目录 读后感—PMBOK第六版 目录 定义活动的过程强调专业分工&#xff0c;将工作包分解成不同的活动&#xff0c;再由专业人员将这些活动细化为具体任务&#xff0c;分配给项目成员完成。 在软件开发项目中&#xff0c;定义活动将项目流程细化为需求分析、系统设计、编码、测试…

了解MySQL 高可用架构:主从备份

为了防止数据库的突然挂机&#xff0c;我们需要对数据库进行高可用架构。主从备份是常见的场景&#xff0c;通常情况下都是“一主一从/(多从)”。正常情况下&#xff0c;都是主机进行工作&#xff0c;从机进行备份主机数据&#xff0c;如果主机某天突然意外宕机&#xff0c;从机…

CPU 和 GPU:为什么GPU更适合深度学习?

目录 什么是 CPU &#xff1f; 什么是 GPU &#xff1f; GPU vs CPU 差异性对比分析 GPU 是如何工作的 &#xff1f; GPU 与 CPU 是如何协同工作的 &#xff1f; GPU vs CPU 类型解析 GPU 应用于深度学习 什么是 CPU &#xff1f; CPU&#xff08;中央处理器&#xff09;…