事件绑定和解绑
事件:触发-响应机制
事件三要素
1.事件源(谁)
2.事件类型(什么事件)
3.事件处理程序(做什么)
//事件源
var box = document.querySelector("div")
//事件类型
box.onclick = function () {
//事件处理程序
console.log(666);
}
点击
绑定事件
addEvenListener()事件监听方式
- eventTarget.addEventListener()方法将指定的监听器注册到 eventTarget(目标对象)上
- 当该对象触发指定的事件时,就会执行事件处理函数
该方法接收三个参数: eventTarget.addEventListener(type,listener[,useCapture])
type:事件类型字符串,比如click,mouseover,注意这里不要带onlistener:事件处理函数,事件发生时,会调用该监听函数useCapture:可选参数,是一个布尔值,默认是 false。
特点:同一个元素同一个事件可以注册多个监听器
var box = document.querySelector("div")
//传统绑定方式
box.onclick = function () {
console.log(666);
}
//监听
box.addEventListener('click', function () {
console.log(1);;
})
box.addEventListener('click', function () {
console.log(2);;
})
box.addEventListener('click', function () {
console.log(3);;
})
解绑事件
传统绑定方式解绑:
box.onclick=函数
box.onclick=null
监听移除:
box.addEventListener
//移除
box.removeEventListener(事件,函数名)
事件类型
鼠标事件
1.onclick 鼠标按下和松开时,鼠标指针在被选元素区域内部
box.addEventListener("click",()=>{
console.log("鼠标按下和松开时 鼠标指针在被选元素区域内部")
})
2.ondblclick
box.addEventListener("dblclick",()=>{
console.log("鼠标第一次按下和第二次松开时,鼠标指针在被选元素区域内部,并且时间间隔不能太长")
})
3.onmousedown
box.addEventListener("mousedown", () => {
console.log("鼠标在被选元素内按下")
})
4.onmouseup
box.addEventListener("mouseup",()=>{
console.log("鼠标在被选元素内松开")
})
5.onmouseover(父元素进入子元素,子元素进入父元素也会算)
box.addEventListener("mouseover", () => {
console.log("鼠标进入被选元素")
})
6.onmouseout(父元素到子元素,子元素到父元素也会算)
box.addEventListener("mouseout", () => {
console.log("鼠标从被选元素出去")
})
7.onmouseleave(从父元素到父元素之外才算,父子元素之间进出不会触发)
box.addEventListener("mouseleave", () => {
console.log("鼠标从被选元素出去")
})
8.onmouseenter(从父元素之外到父元素里才会触发,父子元素之间进出不会触发)
box.addEventListener("mouseenter",()=>{
console.log("鼠标从被选元素进去")
})
9.onwheel
box.onwheel = function () {
console.log("鼠标滚轴滚动时 鼠标指针在被选元素内部")
}
10.onscroll 滚动条不滚动(到底/顶)的时候不会触发
box.addEventListener("scroll",function(){
console.log("元素自己的滚动条滚动啦:单位时间内滚动条的位置发生变化")
})
键盘事件
1.onkeydow 按一次触发一次 数字键盘不触发响应任意按键(除了Fn键)
box2.addEventListener("keydown",function(){
console.log("输入框的键盘按下")
})
2.onkeyup 不松开不触发
box2.addEventListener("keyup", function () {
console.log("输入框的键盘松开")
})
3.onkeypress 返回 ASCII码,可以转换成相应字符,只可以响应字符类键盘按键(输入汉字时,输入确定的字后才会触发,输入字母数字会直接触发)
box2.addEventListener("keypress",function(){
console.log("输入框的键盘按下")
})
4.oninput
box2.addEventListener("input", function () {
console.log("输入框在输入就触发")
})
输入框事件
1.onchange
box2.addEventListener("change",function(){
console.log("输入框失焦并且value改变")
})
box2.focus()
2.onfocus 设置了获焦属性会自动执行一次
box2.addEventListener("focus", function () {
console.log("输入框获取焦时触发")
})
3.onblur
box2.addEventListener("blur", function () {
console.log("输入框失焦时触发")
})
其他
onload 加载完毕时执行
window.onload = function () {
console.log("浏览器加载完毕:5大BOM的功能加载完成")
console.log(document.querySelector("#box3"))
}
console.log(document.querySelector("#box3"), 2222)
onmousemove 鼠标移动时触发
var box = document.querySelector(".box")
box.addEventListener("click", function (e) {
console.log(e.pageY, e.offsetY)
})
var box = document.querySelector(".box")
box.onmousemove = function (e) {
console.log(111, e.movementX)//鼠标移动当前位置与上一个mousemove事件之间的距离
}
事件对象
事件对象
事件对象上存储着事件发生时的相关信息(例如:event.which)
a) 事件处理函数形参ev(event),W3C制定的标准,IE9以下不行
b) 全局对象 window.event用于IE9以下
// 兼容性写法 var event= ev|| window.event
事件对象携带的信息
事件源对象:
event.target 火狐只有这个
event.srcElement IE6/78只有这个
这两个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 跟它是否是定位的元素无关
键盘事件触发时:
charCode/keyCode 键码值 key 键码
37左
38上
39右
40下
13enter
盒子模型
el.offsetWidth:本身宽度+边框线+左右内边距;
el.offsetHeight:本身高度+边框线+上下内边距;
el.offsetTop:相对第一个父级节点有定位属性的上偏移量;
el.offsetLeft:相对有定位属性的父节点左偏移量;
el.clientWidth:本身的宽度+左右内边距;
el.clientHeight:本身的高度+上下内边距;
el.clientTop:上边框线的宽度 el.clientLeft:左边框线的宽度
el.scrollWidth:盒子的实际宽度(包括滚动条不可见部分,不包括边线)
el.scrollHeight:盒子的实际高度(包括滚动条不可见部分,不包括边线)
el.scrollTop:滚动条向下滚动的距离;
el.scrollLeft:滚动条向右滚动的距离;
window.innerHeight:浏览器窗口可见区域高度;
window.innerWidth:浏览器窗口可见区域宽度;
详解:
元素属性:
clientTop:元素上边框的厚度,当没有指定边框厚度时,一般为0。
scrollTop:位于对象最顶端和窗口中可见内容的最顶端之间的距离,简单地说就是滚动后被隐藏的高度。
offsetTop:获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)距离顶端的高度。
clientHeight:内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。
scrollHeight:IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。
offsetHeight:获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)的高度。IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。offsetHeight在新版本的FF和IE中是一样的,表示网页的高度,与滚动条无关,chrome中不包括滚动条。
事件对象:
clientX、clientY:相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性。
pageX、pageY:类似于event.clientX、event.clientY,但它们使用的是文档坐标而非窗口坐标。这2个属性不是标准属性,但得到了广泛支持。IE事件中没有这2个属性。
offsetX、offsetY:相对于事件源元素(target或srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。
screenX、screenY:相对于用户显示器屏幕左上角的X,Y坐标。标准事件和IE事件都定义了这2个属性
封装一个求元素相对于文档的坐标:
let total=0;
Object.prototype.myoffsetTop=function() {
let baba=this.offsetParent
total+=this.offsetTop
if(baba){
baba.myoffsetTop()
}
return total
}