事件
事件
- e.target:目标元素
- e.srcElement:目标元素
- document.documentElement:html元素
- document.body:body元素
- document:根节点
- jd.dataset:获取标签自定义的属性
offset系列
offset翻译过来是偏移量,我们使用offset系列可以动态的得到该元素的位置(偏移),大小等
注意
- 获取元素距离带有定位的父元素位置
- 获取元素自身的大小(宽度高度)
- 返回的值不带单位
offset系列常用属性
- element.offsetParent:返回作为该元素带有定位的父级元素,如果没有父级则返回body
- element.offsetTop:返回元素相对带有定位父元素内容(padding+content)上方上框的偏移
- element.offsetLeft:返回元素相对带有定位父元素左方框的偏移
- element.offsetWidth:返回自身包括padding,边框,内容区的宽度,返回值不带单位
- element.offsetHight:返回自身包括padding,边框,内容区的高度,返回值不带单位
offset与style区别
offset
- offset可以得到任意样式中的样式值
- offse系列获取的数值没有单位
- offsetWidth获取的包含padding,border+width
- offset是只读的
style
- style只能得到行内样式表中的样式值
- style.width获取的带有单位的字符串
- style.width获取不包含padding和border的值
- style.width是可读写属性,可以获取也可以赋值
client系列
client翻译过来就是客户端,我们使用client的相关属性获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素边框的大小,元素的大小
- element.clientTop:返回元素上边框的大小
- element.clientLeft:返回元素左边框的大小
- element.clientWidth:返回包含padding,不包含border的高度,返回值不带单位
- element.clientHeight:返回包含padding,不包含border的高度,返回值不带单位
立即执行函数
(function() {})(参数);
(function() {} (参数));
// 两种定义方式
创建一个独立的作用域
scroll系列
onscroll事件,当滚动滚动条的时候会触发的事件
页面被卷去头部,有兼容问题,因此被卷去的头部通常有如下写法
声明了DTD,使用document.documentBlement.scrollTop
- element.scrollTop:返回被卷去上侧的距离,返回值不带单位
- element.scrollLeft:返回被卷去左侧的距离,返回值不带单位
真正内容大小,如果超过则会超出,网页的滚动条,事件源是document
- element.scrollWidth:返回自身实际高度,不包含边框,返回值不带单位
- element.scrollHeight:返回自身实际宽度,不包含边框,返回值不带单位
总结
- offset系列常用与获取元素的位置
- client系列常用于获取元素的大小
- scroll系列常用于获取滚动条距离
- 页面滚动通过window.pageXoffset获取
动画函数封装
核心原理:利用定时器不断移动盒子位置
不同的元素设置不同的定时器
注意:必须要加定位才可以
节流阀
防止轮播图按钮连续点击造成播放速度过快
节流阀的目的:当上一个函数动画内执行完毕,在去执行下一个函数动画,让事件无法继续连续触发
核心思路:利用回调函数,添加一个变量来控制,锁住函数和解锁函数
-
window.event:事件对象
//兼容 function fn(e) { // 如果e 时PointerEvent e = e.constructor==PointerEvent&&e || window.event }
元素在某种状态(浏览器去实现的)达到时,要执行的提前设定好程序,我们称为事件句柄
三要素:事件源 事件类型 事件处理程序
键盘和鼠标来控制电脑,有鼠标事件和键盘事件
事件绑定方法
行内
<a class="box" onclick="javaScript: myconsole.mylog()"></a> <!-- 本质来说 onclick属性里面是字符串,当点击事件后,v8才开始运行 -->
<div class="box" onclick="myconsole.mylog()"</div>
<div class="box" onclick="fn(this)"</div> <!--this指的时div元素节点-->
<script>
var myconsole = {
mylog: () => {
console.log('我自己写的函数')
}
}
</script>
属性绑定
只能绑定一个handler
var box = document.querSelector(".box")
box.onclick = function() {}
添加一个监听器
box.addEventListener('事件类型',funciton() {})
// 事件类型不加on
//ie
box.attchEvent('click',function(){})
事件解绑
// 属性绑定的
box.onclick = null
<div class="box" onclick=""></div>
<script>
var box = document.querSelctor('.box')
box.onclick = null // 解绑
</script>
function fn() {}
box.addEventListener('click',fn) // 如果是匿名函数,南无监听的移除不了
// 移除监听事件
box.removeEventListener('click')
事件类型
- jd.focus():获取输入框焦点
表单事件
onfocus:获取焦点
onblur:失去焦点
onchange:下拉框选项改变
onsubmit:表单提交
元素自身的事件
onscroll:滚动条在某个 事件单位内,如果当前元素位置改变就触发
oninput:元素的输入框内容变化
onchange:输入框失焦且内容改变
onclick:点击被选元素
onfocus:获取焦点
onblur:失去焦点
onload:加载完毕时执行(浏览器5大DOM的功能加载完成)
鼠标事件
包含body隐藏的
- el.pageX
- el.pageY
相对于浏览器
- el.clientX
- el.clientY
相对于元素自己的
- el.offsetX
- el.offsetY
相对于设备屏幕
- scrollX
- scrollY
box.addEventListener('click',(el)=>{
el.pageX
})
click:只能监听左键(用onmousedown和onmouseup来判断鼠标,event.button来区分鼠标的按键)
dblclick:鼠标第一次按下和第二次松开,并且中间有事件间隔
onmousedown:鼠标在被选元素按下
onmouseup:鼠标在被选元素内松开
onmousemove:鼠标在被选元素内移动
contextmenu,onmouseover,onmouseout,onmouseenter(html5标准),onmouseleave(html5标准)
onwheel:鼠标滚轴滚动时
区别以下的四个
父元素 子元素离开
onmouseover:鼠标进入被选中元素
onmouseout:鼠标从被选元素离开
onmouseleave:鼠标离开被选中元素
onmouseenter:鼠标进入被选中元素
一方面来说onmouseenter和onmouseleave已经默认了阻止冒泡事件,就是说如果触发了事件,父元素不会被触发;onmouseover和onmouseout没有阻止冒泡事件,会触发父元素,如果想要不触发,手动添加代码stopPropagation()
键盘
- el.keyCode:按下键的编码
enter 13
onkeydown:键盘按下
onkeyup:键盘松开
onkeypress:键盘按下又松开
事件对象
在创建事件的时候,会有生成一个事件对象,存储了事件发生的相关信息,但不同的浏览器可能会有些许差异
a) 事件处理函数形参ev(event),W3C制定的标准,IE9以下不行
b) 全局对象 window.event用于IE9以下
// 兼容性写法 var event= ev|| window.event
事件源
event.target // 火狐只有这个
event.srcElement // ie7/ie8只有这个
// chrome都有
var ele = event.target || event.srcElement //兼容性写法
鼠标事件触发的属性
altKey 鼠标事件发生时,是否按下alt键,返回一个布尔
ctrlKey 鼠标事件发生时,是否按下ctrl键,返回一个布尔
metaKey 鼠标事件发生时,是否按下windows/commond键,返回一个布尔
shiftKey 鼠标事件发生时,是否按下shift键,返回一个布尔
pageX 鼠标点击的 X 坐标;(包含body隐藏的)
pageY 鼠标点击的 Y 坐标;(包含body隐藏的)
clientX clientY返回鼠标位置相对于浏览器窗口左上角的坐标,单位为像素(不包括body隐藏的)
screenX screenY返回鼠标位置相对于屏幕左上角的坐标,单位为像素
movementX,movementY返回一个位移值,单位为像素,表示当前位置与上一个mousemove事件之间的距离
offsetX/offsetY 相对于元素自己的x/y 跟它是否是定位的元素无关
事件机制
事件链
-
事件的捕获阶段
-
事件的冒泡阶段
e.stopPropagetion() // 阻止冒泡 不阻止默认事件 // ie e.cancelBUbble = false
e.stopImmediatePropagetion() // 阻止程序传递执行冒泡 不阻止默认事件
易错点:阻止冒泡 设计监听器在捕获阶段运行 都是同一个事件
阻止系统默认事件
e.preventDefault() // 不阻止冒泡
事件代理
给父元素绑定监听器,通过冒泡来动态实现未来添加的子元素也有业务
案例
<style>
.box {
margin: 30px auto;
overflow: hidden;
}
.box li {
list-style: none;
background-color: pink;
margin: 10px;
width: 200px;
height: 30px;
}
</style>
<div class="box">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
<script>
var box = document.querySelector('.box')
box.addEventListener('click',(e)=>{
console.log(e.target) // e.srcElement同样代表目标元素
})
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器