一、事件的绑定语法
语法形式1
? ? 事件监听? 标签对象.addEventListener('click',function(){});
语法形式2
? ? on语法绑定??标签对象.onclick = function(){}
on语法是通过 = 等于赋值绑定的事件处理函数 ,= ? 等于赋值本质上执行的是覆盖赋值,后赋值的数据会覆盖之前存储的数据,也就是on语法 一个标签对象相同的事件类型,只能赋值绑定 一个事件处理函数,如果赋值绑定多个事件处理函数,后赋的事件处理函数会覆盖之间存储的事件处理函数
事件绑定的三要素
? ? 标签对象 ? ?事件源 也就是绑定事件的标签对象
? ? 'click'? ? ? ? ? 事件类型 也就是绑定给标签对象的事件的类型
? ? function(){} ? ?事件处理函数 也就是触发事件时执行的函数程序
? ? ? ? ? ? ? ? ? ? ? ? ? 是回调函数语法形式,可以是函数名称,也可以是匿名函数
二、事件的删除语法
1.on语法绑定事件的删除
? ? 因为 on语法是 = 等于赋值操作,只要赋值一个 null / 空函数,触发事件时就没有调用执行的函数程序达到删除事件的效果
2.事件监听语法的删除
? ? 需要专门的删除函数方法:标签对象.removeEventListener('事件类型',事件处理函数);
? ? 只能删除绑定的是函数名称的事件处理函数,如果绑定的是匿名函数,不能删除
注意:
? ? 实际操作中,如果不需要删除事件处理函数,推荐使用匿名函数语法形式
? ? 实际操作中,如果必须要删除事件处理函数,只能绑定函数名称
<!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>
</head>
<body>
<div>我是div标签对象</div>
<button>绑定</button>
<button>删除</button>
<script>
//获取标签对象
var oDiv = document.querySelector('div');
var oBtn1 = document.querySelectorAll('button')[0];
var oBtn2 = document.querySelectorAll('button')[1];
oBtn1.addEventListener('click', function () {
//on语法绑定事件
//oDiv.onclick = function(){console.log(111)};
//事件监听语法绑定
//绑定的匿名函数
oDiv.addEventListener('click', function () { console.log(111) });
//绑定的函数名称
oDiv.addEventListener('click', funA);
oDiv.addEventListener('click', funB);
oDiv.addEventListener('click', funC);
})
//删除绑定的事件
oBtn2.addEventListener('click', function () {
//删除on语法绑定的事件
//oDiv.onclick = null;
//oDiv.onclick = function(){};
//绑定的匿名函数无法删除,因为两个匿名函数内存地址不同
//假设绑定的内存地址是 00ff11
//删除的内存地址可能是 00ffzz
//不能设定正确的删除的内存地址
oDiv.removeEventListener('click', function () { console.log(111) });
//绑定的是函数名称,函数名称中存储的是内存地址
//以下可以删除
oDiv.removeEventListener('click', funA);
oDiv.removeEventListener('click', funB);
oDiv.removeEventListener('click', funC);
});
function funA() {
console.log('aaa');
}
function funB() {
console.log('bbb');
}
function funC() {
console.log('ccc');
}
</script>
</body>
</html>
三、默认事件
默认事件是html标签默认执行的程序效果
? ? 有:超链接的点击跳转,form标签的点击跳转,鼠标右键
阻止默认事件
事件处理函数中定义一个形参 形参名称一般是 e / event
? ? 标签对象.addEventListener('事件类型' , function( e / event ){
? ? ? ? ? ?// 阻止默认事件执行
? ? ? ? ? ?形参.prevenDefault();
? ? })
超链接
? ? 给 超链接标签 添加 点击事件
form标签
? ? 给 form标签 添加 submit 提交事件
鼠标右键
? ? 给 document 添加 contextmenu 鼠标右键事件
四、阻止事件的传播
父级标签和后代标签添加了相同类型的事件,后代标签触发事件父级标签也会触发相同类型的事件,这样的执行原理称为事件的传播或者冒泡事件
阻止事件的传播语法
? ? 标签对象.addEvenListener(事件类型,function(e/event){
? ? ? ? ? ?e.stopPropagation();??
? })
事件传播的方式
之前 旧版本 中 事件的传播方式有两种
? ? 冒泡? 子级 --- 父级
? ? 捕获? 父级 --- 子级
现在 新版本 浏览器中 默认只有 冒泡方式 没有 捕获方式
? ? 事件监听语法绑定 事件处理函数
? ? 参数3 如果设定 为 true 事件的传播 执行 捕获方式
五、常见的事件类型
1. window相关的事件类型
1.1 浏览器视窗窗口大小监听事件
? ? window.addEventListener( 'resize' ,function(){} )
1.2 页面滚动监听事件
? ? window.addEventListener( 'scrool',function(){} )
1.3 浏览器加载事件
? ? window.addEventListener( 'load',function(){})
1.5 新窗口打开url连接
? ? window.open(url地址)
1.6 关闭当前窗口
? ? window.close()
2. 鼠标相关的事件类型
? click? ? ? ? ? ? ? 鼠标左键单击
? dblclick? ? ? ? ?鼠标左键双击
contextmenu? 鼠标右键单击
? mousedown 鼠标按键按下
? mouseup? ? ? 鼠标按键抬起
? mousemove 鼠标移动
? mouseover? ?鼠标移入? ?mouseenter
? mouseout? ? ?鼠标移出? ?mouseleave
3. 键盘相关的事件类型
? ?keydown ? ? 键盘按键按下
? ?keyup? ? ? ? ? 键盘按键抬起
? ?keypress? ? ?键盘按键按下
4. 表单相关事件
? ?submit ? ? ?表单提交事件
? ?focus? ? ? ? 标签获取焦点
? ?blur? ? ? ? ? ?标签失去焦点
? ?change ? ? 标签失去焦点同时数据改变
? ?input? ? ? ? ?输入数据
5. 移动端事件
? ?touchstart ?触摸开始
? ?touchend ? 触摸结束
? ?touchmove ? 触摸移动
6. 特殊事件
? ?transitionstart ? ? 过渡开始
? ?transitionend ? ? ?过渡结束
? ?animationstart ? ?动画开始
? ?animationend ? ? 动画结束
一定是绑定事件的标签 也就是 事件源 范围内 才能触发事件
全屏触发事件 需要给
? ? document
? ? document.documentElement
? ? document.body
绑定事件
? ? 有些事件都能支持, 有些事件只有某个对象支持
六、事件对象
事件对象(event),事件处理函数中参数存储的数据数值,是触发事件的对象
触发事件的对象和绑定事件的不一定是同一个对象
触发事件时 JavaScript程序 自动向形参中存储实参
也就是 向 事件对象 中 自动储存 触发事件的标签对象 相关的数据信息
事件源.addEventListener(事件类型,function(时间对象){})
? ? ? ?事件对象.target
? ? ? ? ? ? ? 存储的是触发事件的标签对象
? ? ? ? ? ? ? 支持所有DOM操作语法
七、事件委托语法
不是直接给标签对象绑定事件,而是给父级标签绑定事件,通过事件对象.target判断触发事件的不同的标签对象,执行不同的函数程序
标签对象.target 就是一个DOM标签对象
? ? 标签对象.target.tagName 是大写英文字符的标签名称
? ? 标签对象.target 执行DOM操作,判断点击的是什么标签
如果有div标签包含span标签 h1标签 a标签 p标签 ,给各标签添加不同的点击事件
一般是获取每一个标签对象,绑定点击事件,阻止事件的传播
实际操作中,只要根据不同的条件,触发不同的if判断,执行不同的程序,就OK了
<!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>
</head>
<body>
<div>
我是div标签对象<br>
<span>我是span标签</span>
<h1 id="h1">我是h1标签</h1>
<a href="JavaScript:;">我是a标签</a>
<p>我是p标签</p>
</div>
<script>
// 事件委托
// 给父级div标签添加点击事件
// 通过 事件对象.target 判断 触发事件的是什么标签
// 根据不同的标签 触发执行不同的程序
var oDiv = document.querySelector('div');
oDiv.addEventListener('click' , function(e){
// 事件委托 点击事件会触发
// 触发事件标签 标签名称是 div 证明点击的是div标签
if( e.target.tagName === 'DIV' ){
console.log( '您点击的是div标签' );
}else if( e.target.tagName === 'SPAN' ){
console.log( '您点击的是span标签' );
}else if( e.target.id === 'h1' ){
console.log( '您点击的是h1标签' );
}else if( e.target.getAttribute('href') === 'JavaScript:;' ){
console.log( '您点击的是a标签' );
}else if( e.target.innerHTML === '我是p标签' ){
console.log( '您点击的是p标签' );
}
});
</script>
</body>
</html>
分别点击各标签,执行结果如下:
|