来来来,JavaScript核心基础语句送给你们
学JS你不会DOM算真的学会了吗?
对JavaScript中的 事件 进行疯狂 处理
用BOM来实现轮播图效果
我们来实现创建JavaScript中的自定义对象
JS中构造函数的原型prototype
还不明白JS中的内置对象吗? 快来这里!
JavaScript中数据如何存储在客户端?带你看看Cookie和WebStorage

一、简介

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

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

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

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

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

二、绑定事件

三种方式:

  • 静态绑定:通过为标签的事件属性赋值
<script>function $(){console.log("静态绑定");}
</script>
<input type="button" value="按钮" onclick="$()">
  • 动态绑定:通过为DOM对象的事件属性赋值
<input type="button" value="按钮" id="btn">
<script>var btn = document.getElementById("btn");btn.onclick = function(){concole.log("动态绑定");}
</script>
  • 动态绑定:通过为DOm对象进行事件监听,使用addEventListener(“事件名”,回调函数)
<script>var btn = document.getElementById("btn");btn.addEventListener('click',function(){console.log("动态绑定");});
</script>

注意:

  • 可以通过事件回调函数的第一个参数获取事件对象event

target 事件的目标元素,即事件源
type 事件类型
timeStamp 事件生成的日期和时间
clientX当事件被触发时,鼠标指针的水平坐标
clientY 当事件被触发时,鼠标指针的垂直坐标

  • 在事件回调函数中,this表示事件源,即发生事件的元素
<script>window.onload = function(){var btn = document.getElementById('btn');btn.onclick = function(event){        //事件触发时会自动回调函数传入一个参数,表示event事件对象console.log(event);console.log(event.target);console.log(event.type);console.log(this == event.target)     //this表示事件源}}function f(e){console.log(e);}
</script>
<body><button id="btn">按钮<button><!-- 静态绑定事件时,需要在绑定事件回调函数时接受事件对象参数--><button onclick="f(event)">按钮</button>
</body>

三、常用事件

1. 鼠标事件

事件名 描述
onclick 鼠标单击
ondblclick 鼠标双击
onmouseover 鼠标移动到某元素之上
onmouseout 鼠标从某元素上移开
onmousedown 鼠标按钮被按下
onmouseup 鼠标按钮被松开
onmousemove 鼠标被移动

2.键盘事件

事件名 描述
onkeydown 某个键盘的按键被按下去
onkeyup 某个键盘的按钮被松开
onkeypress 某个键盘的按键被按下去且松开
<script>var username = document.getElementById('username');username.onkeydown() = function(e){if(e.key==13){     //当按下回车键时输出console.log("first");}}username.onkeypress = function(){console.log("second");}username.onkeyup = function(){console.log("third");}
</script>
<body><input type="text" id="username">
</body>

3. 表单事件

事件名 描述
onfocus 元素获取焦点
onblur 元素失去焦点
onchange 域的内容发生改变,一般用于文件选择器和下拉列表
onselect 文本内容被选中
onsubmit 表单提交前触发,回调函数返回true表示允许表单提交,返回false表示阻止表单提交
<style>.border{border:1px solid red;}#img{width:100px;height:100px;}#head{display:none;}
</style>
<script>window.onload = function(){//获得焦点document.getElementById('username').onfocus = function(){this.classList.add('border');}//失去焦点document.getElementById('username').onblur = function(){this.classList.remove('border');}//域中内容发生改变document.getElementById('eat').onchange = function(){console.log(this.checkbox);}//文件选择器,更换头像document.getElementById('head').onchange = function(){document.getElementById('img').src = window.URL.createObjectURL(this.files[0]);}//被选中的内容改变样式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>
<body><form action="" id="frm">用户名:<input type="text" id="username"> 爱好:<input type="checkbox" name="hobby" id="eat" value="eat"><label for="eat">吃</label>头像:<input type="file" id="head"><label for="head"><img src="data:images/default.jpg" id="img"></label>邮箱:<input type="text" id="email" value="zack@sina.com.cn"    name="email"><input type="submit" value="提交"></form>
</body>
复选框的全选
<!--* @Author: your name* @Date: 2020-09-25 09:23:27* @LastEditTime: 2020-10-03 17:57:12* @LastEditors: Please set LastEditors* @Description: In User Settings Edit* @FilePath: \DOM\DOM\document.html
-->
<!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>#table{width: 500px;height: 200px;margin: 0 auto;border-collapse: collapse;}td,th{border: 1px solid #ccc;}tbody tr{text-align: center;}</style><script>window.onload = function(){//实现全选和取消全选的效果var all = document.getElementById('all');all.onchange = function(){var items = document.getElementsByName('item');for(var item of items){item.checked = this.checked;}}//实现当选中下面所有复选框时自动选中全选var items = document.getElementsByName('item');for(var item of items){item.onchange = function(){//先勾选全选all.checked = true;//判断只要有一个没选,则不会勾选全选for(var element of items){if(!element.checked){all.checked = false;break;}}}}}</script>
</head>
<body><table id="table"><thead><tr><th>全选 <input type="checkbox" id="all"></th><th>序号</th><th>姓名</th><th>年龄</th><th>性别</th><th>爱好</th></tr></thead><tbody><tr><td><input type="checkbox" name="item"></td><td>1</td><td>Tom</td><td>90</td><td>男</td><td>吃饭</td></tr><tr><td><input type="checkbox" name="item"></td><td>2</td><td>Zack</td><td>9</td><td>男</td><td>睡觉</td></tr><tr><td><input type="checkbox" name="item"></td><td>3</td><td>Alice</td><td>19</td><td>女</td><td>打游戏</td></tr></tbody></table>
</body>
</html>

四、事件操作

1. 事件流

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

分类:事件冒泡、事件获取

2. 事件冒泡/事件获取

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

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

接下来我们来看看事件冒泡

<!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 {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 print(name){console.log(name);}</script>
</head>
<body><div class="div1" onclick="print('div1')">div1<div class="div2" onclick="print('div2')">div2<div class="div3" onclick="print('div3')">div3<div class="div4" onclick="print('div4')">div4</div></div></div></div>
</body>
</html>


我们打开浏览器的控制台就会发现,点击div4时会将四个div的名字都输出,这就是事件流中的事件冒泡。我们可以将这种情况理解成事件传播,从当前元素传播到根元素。

接下来我们来看看事件捕获

<!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 {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>window.onload = function(){function $(id){return document.getElementById(id);}$('div1').addEventListener('click',function(){console.log('div1');},true)     //第三个参数为true表示采用事件捕获,默认为false表示冒泡排序$('div2').addEventListener('click',function(){console.log('div2');},true)$('div3').addEventListener('click',function(){console.log('div3');},true)$('div4').addEventListener('click',function(){console.log('div4');},true)}</script>
</head>
<body><div id="div1">div1<div id="div2">div2<div id="div3">div3<div id="div4">div4</div></div></div></div>
</body>
</html>

事件捕获显示的效果与事件冒泡正好相反,从根元素向当前元素传播,因此就是从div1到div4输出。

当我们将div3的函数操作改为以下操作,就只会输出div4和div3.

$('div3').addEventListener('click',function(event){console.log('div3');event.stopPropagation();    //阻止事件冒泡
},false)

3. 事件代理/事件委托

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

优点:

  1. 减少事件注册,降低内存占用
  2. 新增元素时实现动态绑定
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>window.onload = function(){/*var lis = document.querySelectorAll('li');for(li of lis){li.onclick = function(){//console.log(this);    //事件源console.log(this.innerText);}}*/document.querySelector('ul').onclick = function(e){console.log(e.target.innerText);}}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()">添加1</button><ul><li>li1</li><li>li2</li><li>li3</li><li>li4</li><li>li5</li></ul>
</body>
</html>

注释里面的内容是使用原始的方法,大家可以与事件代理的方法作比较,体会一下它们的差异。

5. 事件默认行为

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

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

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><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>
</body>
</html>

对JavaScript中的 事件 进行疯狂 处理相关推荐

  1. 浅谈JavaScript中的事件

    事件在javascript中是响应用户的一种基本操作,本文列举了两种javascript中的事件模型及其绑定的方式,希望能对你的学习带来一点帮助.这些都是非常基础的但或许其中有你所遗漏.(以下事件均针 ...

  2. JavaScript学习笔记06【高级——JavaScript中的事件】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  3. 【前端学习】前端学习第十五天:JavaScript中的事件模型

    在各种浏览器中存在三种事件模型:原始事件模型.DOM事件模型和IE事件模型: 一.原始事件模型: 原始事件模型被所有浏览器支持: 在原始事件模型中.事件一旦发生就直接调用事件处理函数,事件不会向别的对 ...

  4. java基础66 JavaScript中的事件、localtion对象、screen对象(网页知识)

    1.JavaScript中的事件注册 1.1.事件的注册方式 方式1:直接在html元素上注册<body onLoad="ready()"></body > ...

  5. 12.在JavaScript中的事件模型如何理解?

    一.事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件.鼠标事件.自定义事件等 由于DOM是一个树结构,如果在 ...

  6. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

  7. 理解JavaScript中的事件

    在很多语言的学习中,"事件"都是一个比较难理解,但是又是一个很重要的概念.JavaScript中的事件处理也是一样,正因为有了事件处理,才会出现Ajax拖动的效果.本文就讨论一下J ...

  8. php event loop,理解javascript中的事件循环(Event Loop)

    背景 在研究js的异步的实现方式的时候,发现了JavaScript 中的 macrotask 和 microtask 的概念.在查阅了一番资料之后,对其中的执行机制有所了解,下面整理出来,希望可以帮助 ...

  9. javascript中定义事件的三种方式

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...

  10. Javascript中的事件冒泡

    这是一个基础性的文章,使用Javascript观察DOM中的事件冒泡机制,并介绍如何阻止默认行为和如何组织事件冒泡的方法. 1. 第一个例子可以在Firefox下运行 <div id=" ...

最新文章

  1. 转 ofbiz的webservice接口提供(2)-数据类型的局限性
  2. QT的QCommandLineParser类的使用
  3. 表里有索引,为什么还都是全表扫描?
  4. 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
  5. P4492-[HAOI2018]苹果树【dp】
  6. setBackgroundResource的一个问题
  7. 我年龄大了还学的动it吗
  8. Win11、Linux 双系统安装方法
  9. 软考信息系统项目管理师论文范文:论项目的质量管理论项目的质量管理
  10. Mybatis使用关联查询由于表名字段重复导致的问题
  11. java异常以及处理
  12. antd table组件 表格内换行
  13. 需求预测模型分类与选择
  14. paa抗衰机器人的功效_【图】- PAA抗衰系统是什么?PAA智抗衰机器人详细解析! - 广州白云其他服务 - 广州百姓网...
  15. iOS开发 --- 开发工具
  16. matlab之判别分析
  17. 深信服下一代防火墙(不懂看过来!)
  18. 苹果计算机的优势,苹果电脑有什么优势
  19. XDOC云服务API(七)
  20. matlab使用load函数读取txt数据时,出现锘? xxxxx 。的解决办法

热门文章

  1. OpenCV图像处理——阈值处理/二值化(python实现和c++实现)
  2. tp摄像头的默认地址_tplink的ip默认地址是什么?
  3. 2020年10月最新免费加速下载百度网盘文件方法
  4. 张宇基础30讲——第6讲-中值定理
  5. java毕业设计针织企业外包系统Mybatis+系统+数据库+调试部署
  6. 深度学习在内窥镜图像方面的研究:
  7. 前端做微信好友分享_前端实现微信平台实现分享
  8. 天涯 大神 kkndme 房地产 调控
  9. JPEG添加EXIF
  10. ipa在线安装搭建_最新!超级签名系统源码以及搭建过程