day11 事件上
概述
事件是指代一个东西的操作被另外一个东西进行监听的一个过程(事件),这个过程可以完成对应的操作(处理函数).事件监听器是一个标准的观察着模式(observe)
示例(标准)
点击按钮触发一个操作改变按钮的颜色
-
事件名 点击
-
执行对象 按钮
-
处理对象 js引擎
-
处理函数 改变按钮颜色
事件模式
内联模式(嵌入到标签中)
<!--内联模式相当于直接帮你执行代码,以浏览器本身来执行 window来执行-->
<!--里面直接嵌入代码-->
<button onclick='alert('你好')'>点击弹窗</button>
<!--在里面调用函数,以代码的形式进行执行-->
<button onclick='headerClick()'>点击弹窗</button>
<script>
function headerClick(){
alert('你好')
}
</script>
脚本模式 (分离与标签中)
<button class="btn">脚本模式</button>
<button class="btn1">脚本模式1</button>
<script>
var btn = document.querySelector('.btn')
btn.onclick = function(){
console.log('hello world')
console.log(this)
}
document.querySelector('.btn1').onclick = sayHello
function sayHello(){
alert('hello')
}
内联模式与脚本模式区别
-
内联模式相当于属性赋值 里面的代码是window对象帮你执行的 二脚本模式里面的this执行当前的调用元素
-
脚本模式看不见调用函数 内联模式是可以直接看见执行的函数
事件名的分类
事件的构成
触发对象.on+事件名=处理函数
鼠标事件
-
点击事件 click (先按下再弹起 完成一次点击事件)
-
按下 mousedown
-
弹起 mouseup
-
双击事件 dblclick
-
鼠标移入 mouseenter (不支持事件冒泡)
-
鼠标移除 mouseleave
-
鼠标移入 mouseover
-
鼠标移除 mouseout
-
鼠标右键 contextmenu
-
鼠标移动 onmousemover
冒泡(从里到外 快)和捕获(从外到里)
注意事项
执行顺序 mousedown mouseup click
mouseenter/mouseleave以及mouseover/mouseout 前者不会发生事件冒泡(子元素不会触发) 后者会发生事件冒泡(子元素会触发)
移动端没有点击事件
键盘事件(key)
-
按下 keydown
-
弹起 keyup
-
按下字符键(非功能键) keypress (包含按下和弹起)
非功能键触发过程 keydown--keypress--keyup
window.onkeydown = function(){
console.log('按下')
}
window.onkeyup = function(){
console.log('弹起')
}
window.onkeypress = function(){
console.log('非功能键按下')
}
HTML事件
window窗口相关事件
-
load 加载事件
-
unload 卸载事件
-
close 关闭
-
beforeunload 卸载之前
-
beforeprint 打印之前
-
error 错误
-
resize 重新设置大小
-
reset 重新设置位置
-
scroll 滚动栏滚动
-
hashchange hash值变化
-
popstate history的state发生变化
-
....
window.onload = function(){
console.log('窗口加载的时候触发')
}
window.onunload = function(){
console.log('窗口卸载的时候触发')
}
window.onclose = function(){
console.log('窗口关闭的时候触发')
}
//页面卸载之前触发
window.onbeforeunload = function(){
console.log('在卸载之前触发')
}
window.onbeforeprint = function(){
console.log('在打印之前触发')
}
window.onerror = function(){
console.log('窗口出错的时候触发')
}
window.onresize = function(){
console.log('窗口课操作空间大小发生变化的时候触发')
}
window.onreset = function(){
console.log('窗口重新设置位置的时候触发')
}
window.onscroll = function(){
console.log('窗口滚动栏发生变化的时候触发')
}
window.onhashchange = function(){
console.log('hash值发生变化的时候触发')
}
window.onpopstate = function(){
console.log('history中的state发生变化的时候触发')
}
表单相关事件(输入事件)
-
input 输入
-
change value值发生变化
-
focus 获取焦点
-
blur 失去焦点
-
select 内容被选择
-
submit 提交
-
reset 重置
-
...
<form action="">
<input type="text">
<select name="" id="">
<option value="1">1</option>
<option value="2">2</option>
</select>
<textarea name="" id="" cols="30" rows="10"></textarea>
<button type="reset">重置结果</button>
<button type="submit">提交</button>
</form>
<script>
var inp = document.querySelector('input')
var select = document.querySelector('select')
var textarea = document.querySelector('textarea')
//输入事件
inp.oninput = function(){
console.log('表单输入')
}
//必须先失去焦点
inp.onchange = function(){
console.log('值变化')
}
//value 改变事件
select.onchange = function(){
console.log('value发生变化')
}
//获取焦点事件
inp.onfocus = function(){
console.log('获取焦点')
}
inp.oninput = function(){
console.log('表单输入')
}
//失去焦点
inp.onblur = function(){
console.log('失去焦点')
}
//选中内容触发事件
inp.onselect = function(){
console.log('内容选中触发')
}
document.forms[0].onsubmit = function(){
console.log('提交')
}
document.forms[0].onreset = function(){
console.log('重置')
}
</script>
event
概述:事件源对象,他包含了事件触发过程中的内容,以及对应的元素内容,他会默认传入给对应的事件的处理函数
处理函数的arguments
对应的处理函数的arguments呼传递一个参数 二这个参数就是对应的事件源对象
这个事件源对象一般使用形参e来表示 一般的兼容写法为 e == e || window.event
event对象里面的相关属性
-
type 触发事件的类型 *
-
target 触发的目标元素 *
-
currentTarget 当前加事件的元素 *
-
button 鼠标点击的按钮
-
screenX screenY 获取当前鼠标在屏幕上的位置
-
pageX pageY 获取当前鼠标在页面上的位置(包含滚动栏位置)
-
clientX clientY 获取当前鼠标在可视区的位置 (不包含滚动栏)
-
offsetX offsetY 获取当前鼠标在目标元素上的位置
-
altKey shiftKey ctrlKey 是否按下对应的功能键 *
-
cancelBubble 取消冒泡 *
-
returnValue 是否执行对应的默认行为 *
-
bubbles 是否冒泡 *
<div>
<button>按钮</button>
</div>
<script>
var btn = document.querySelector('button')
btn.onclick = function(e){
//兼容写法
e == e || window.event
console.log(e)
//对应的属性
console.log(e.type) //获取对应的事件名
console.log(e.target) //获取对应的事件目标元素 当你执行事件的目标元素
console.log('按钮出发了')
console.log(e.currentTarget) //获取当前加事件的元素
//位置 鼠标点击的位置
//获取鼠标点击位置的页面坐标 包含滚动栏
console.log(e.pageX)
console.log(e.pageY)
//获取鼠标在页面可视区的位置 不包含滚动栏 加上导航栏的位置
console.log(e.clientX)
console.log(e.clientY)
//ctrlKey shiftKey altKey 是否按着Ctrl键 是否按着shift键 是否按着alt键
console.log(e.ctrlKey,e.shiftKey,e.altKey)
//按着 鼠标左键 鼠标滚轮 鼠标右键 0 1 2
console.log(e.button)
//取消冒泡
console.log(e.cancelBubble) //默认值为false
//返回的value值 返回true就可以走 返回false就不能走 走不走对应的默认行为
console.log(e.returnValue) //默认值true
//是否冒泡
console.log(e.bubbles)
}
//当你点击对应的div里面的按钮的时候 会触发对应的div事件 那么这个事件被称为冒泡
document.querySelector('div').onclick = function(e){
console.log('div触发了')
console.log(e.target) //获取对应的事件的目标元素 如果是按钮触发的话 那么target会指向对应的按钮
console.log(e.currentTarget) //获取当前加事件的元素
}
</script>
键盘相关的event属性
-
key按下的键 返回的是字符串
-
keyCode 按下键的ascii码 (返回大写的ascii码 如果是keypress是事件那么返回对应的ascii码)
-
charCode 字符按下键才有的ascii码 如果是给keypress事件那么对应的keyCode和keyCode是一致的
window.onkeypress = function(e){
console.log(e)
//属于键盘事件的属性
consloe.log(e.key) //按下的键 返回键的字符串
console.log(e.keyCode) //按下键的ascii码 返回大写的ascii码
console.log(e.charCode) //字符键按下才有的ascii 如果给keypress事件那么对应的可以Code和charCode是一致的
}
事件委托机制(事件代理)
概述:事件委托机制就是将自己相关的事件委托给对应的父元素去添加,在内部利用对应的target来指向指向元素的特性来进行相关操作
示例
给所有的li添加一个点击事件点击添加背景颜色
<!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>
/* ul{
list-style: none;
} */
</style>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
<script>
//原本的做法 获取所有的li 遍历添加点击事件
//利用是事件委托 将对应的点击事件委托给对应的父元素 ul
var ul = document.querySelector('ul')
ul.onmouseover = function(e){
e = e || window.event
//利用e.target来获取对应的执行元素
if(e.target.tagName = 'li'){
//排他思想
//将所有的li颜色变为白色
for(var li of ul.children){
li.style.backgroundColor = '#fff'
}
//给li添加背景颜色
e.target.style.backgroundColor = 'skyblue'
}
}
//应用场景 如果有多个沟共同元素要添加一个事件 那么可以委托他的父元素来进行代理
//注意事项 如果需要使用事件委托 那么对应的事件一定要支持事件冒泡(利用事件冒泡来完成)
</script>
</body>
</html>
注意事项
-
如果需要使用事件委托 那么对应的事件一定要支持事件冒泡(利用事件冒泡来完成)
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)