JavaScript 事件处理

news2024/12/22 23:00:14

一、简介

​ 事件:发生在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.coloradmin.cn/o/2141635.html

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

相关文章

【课程系列12】某客时间AI大模型微调训练营

某客时间AI大模型微调训练营 链接 百度网盘地址&#xff1a;https://pan.baidu.com/s/1ZC-fOC_QQjNM6wyVjQcYOg 课程内容 https://u.geekbang.org/subject/finetuning?utm_sourceu_nav_web&utm_mediumu_nav_web&utm_termu_nav_web 深度解读 AI 发展四轮浪潮 技术浪…

PMP--一模--解题--111-120

文章目录 10.沟通管理111、 [单选] 干系人感觉他们收到的信息十分复杂&#xff0c;难以理解&#xff0c;因此&#xff0c;不能正确做出决定。若要解决这个问题&#xff0c;应该怎么做&#xff1f; 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确认工作优先顺序…

【网络】TCP/IP 五层网络模型:数据链路层

文章目录 认识以太网mac 地址mac 地址和 IP 地址的区别 类型ARP 协议 MTU 日常开发主要是应用层&#xff0c;传输层和应用层密切交互&#xff0c;传输层用到的也不少。网络层以及再往下&#xff0c;日常开发就涉及到的非常少了 认识以太网 插网线的上网方式 80211 是无线 WiF…

Encountered error while trying to install package.> lxml

Encountered error while trying to install package.&#xff1e; lxml 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城…

代码管理系统简介与部署(Introduction and Deployment of Code Management System)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

TCP.IP四层模型

一、TCP/IP模型协议分层 1、应用层&#xff1a; 2、传输层&#xff1a; TCP&#xff1a;传输控制协议 UDP&#xff1a;用户数据报协议 3、网络层&#xff1a; IP: 国际协议&#xff08;IP地址&#xff09; ICMP&#xff1a; 互联网控制消息协议&#xff08;互联网…

dedecms(四种webshell姿势)、aspcms webshell漏洞复现

一、aspcms webshell 1、登陆后台&#xff0c;在扩展功能的幻灯片设置模块&#xff0c;点击保存进行抓包查看 2、在slideTextStatus写入asp一句话木马 1%25><%25Eval(Request(chr(65)))%25><%25 密码是a&#xff0c;放行&#xff0c;修改成功 3、使用菜刀工具连…

【Python笔记】PyCharm大模型项目环境配置

一、PyCharm创建新项目 二、更新pip版本 ...>python.exe -m pip install --upgrade pip 三、生成所需requirements配置文件 ...>pip freeze > requirements.txt 四、安装所需组件requirements.txt ...>pip install -r requirements.txt

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…

Linux下文件下载中文乱码问题

最近做的一个项目中&#xff0c;本地打包到线上后&#xff0c;发现生成的文件中出现中文乱码&#xff0c;但在本地运行正常。经排查&#xff0c;文件输入输出流都指定了utf-8的编码格式&#xff0c;IDE的File Encodings也都是utf-8&#xff0c;Linux编码格式也是utf-8&#xff…

JS基础之【对象详解 -- 对象的属性与方法、遍历对象与内置对象】

&#x1f680; 个人简介&#xff1a;某大型国企高级前端开发工程师&#xff0c;7年研发经验&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码…

【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623

1. 力扣1022&#xff1a;从根到叶的二进制之和 1.1 题目&#xff1a; 给出一棵二叉树&#xff0c;其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。 例如&#xff0c;如果路径为 0 -> 1 -> 1 -> 0 -> 1&#xff0c;那…

如何在kotlin中给空字符串(””)和null值设置默认值问题?

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

句子成分——每日一划(九)

人民英雄&#xff0c;永垂不朽&#xff01; 目录 一、原句 二、主语 三、谓语 四、介词短语 一、原句 Eternal glory to the heroes of the people who from 1840 laid down their lives in the many struggles against domestic and foreign enemies and for national i…

关于安卓App自动化的一些想法

安卓App自动化一般使用PythonAppium。页面元素通常是使用AndroidStudio中的UI Automator Viewer工具来进行页面元素的追踪。但是这里涉及到一个问题就是&#xff0c;安卓apk在每次打包的时候&#xff0c;会进行页面的混淆以及加固&#xff0c;所以导致每次apk打包之后会出现页面…

C++ | Leetcode C++题解之第407题接雨水II

题目&#xff1a; 题解&#xff1a; class Solution { public:int trapRainWater(vector<vector<int>>& heightMap) {int m heightMap.size(), n heightMap[0].size();int maxHeight 0;int dirs[] {-1, 0, 1, 0, -1};for (int i 0; i < m; i) {maxHei…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(2)---置顶和取消置顶(含示例代码)

一、预览 获取winform的置顶参数,和设置置顶参数 1.1 置顶(默认不置顶) 1.2 示例代码

VSCode C++ Tasks.json中的变量

前言 上文介绍了在VSCode中创建C项目和编译多文件的情况。本文将介绍Tasks.json中一些变量的含义&#xff1b; 内容 tasks.json文件 下文参考VSCode文档&#xff1a;Visual Studio Code 变量参考 预定义标量 ${userHome} - 用户主文件夹的路径${workspaceFolder} - 在 VS Co…

[产品管理-22]:NPDP新产品开发 - 20 - 产品设计与开发工具 - 开发、制造、装配阶段

目录 前言&#xff1a; 一、原型法 - 开发阶段首先开发原型 1.1 概述 1、定义 2、目的 3、类型 4、开发过程 5、优点与缺点 优点 缺点 6、应用实例 1.2 开发阶段 1. Alpha 原型阶段 - 实验室验证 2. Beta 原型阶段 - 客户现场验证 3. 试生产原型阶段 4. 虚拟原…

【机器学习】多模态AI——融合多种数据源的智能系统

随着人工智能的快速发展&#xff0c;单一模态&#xff08;如文本、图像或语音&#xff09;已经不能满足复杂任务的需求。多模态AI&#xff08;Multimodal AI&#xff09;通过结合多种数据源&#xff08;如文本、图像、音频等&#xff09;来提升模型的智能和表现&#xff0c;适用…