1、事件
事件:触发-响应机制
Event接口表示在DOM中发生的任何事件,一些是用户生成的(例如鼠标或键盘事件),而其他由API生成。
事件三要素
-
事件源:触发(被)事件的元素
-
事件类型:事件的触发方式(例如鼠标点击或键盘点击)
-
事件处理程序:事件触发后要执行的代码(函数形式)
事件的基本使用
var box = document.getElementById('box');
box.onclick = function() {
console.log('代码会在box被点击后执行');
};
2、为元素绑定多个事件
<input type="button" value="按钮" id="btn"/>
<script>
function my$(id){
return document.getElementById(id);
}
my$("btn").onclick=function () {
console.log("第一个");
};
my$("btn").onclick=function () {
console.log("第二个");
};
my$("btn").onclick=function () {
console.log("第三个");
};
</script>
注意:这种方式不能为元素绑定多个事件,前两个会被覆盖,只会执行第三个。
如何才能为元素绑定多个事件呢?
1 对象.addEventListener("事件类型",事件处理函数,false);--谷歌和火狐支持,IE8不支持
2 对象.attachEvent("有on的事件类型",事件处理函数)--谷歌不支持,火狐不支持,IE8支持
- 为按钮绑定点击事件
参数1:事件的类型---事件的名字,没有on
参数2:事件处理函数---函数(命名函数,匿名函数)
参数3:布尔类型,目前就写false
谷歌和火狐支持
//为同一个元素绑定多个相同的事件--
my$("btn").addEventListener("click",function () {
console.log("第一个");
},false);
my$("btn").addEventListener("click",function () {
console.log("第二个");
},false);
my$("btn").addEventListener("click",function () {
console.log("第三个");
},false);
my$("btn").addEventListener("click",function () {
console.log("第四个");
},false);
参数1:事件类型---事件名字,有on
参数2:事件处理函数---函数(命名函数,匿名函数)
IE8支持
my$("btn").attachEvent("onclick",function () {
console.log("1");
});
my$("btn").attachEvent("onclick",function () {
console.log("2");
});
my$("btn").attachEvent("onclick",function () {
console.log("3");
});
为多个元素绑定事件兼容代码
//为任意元素.绑定任意的事件, 任意的元素,事件的类型,事件处理函数
function addEventListener(element,type,fn) {
//判断浏览器是否支持这个方法
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}else{
element["on"+type]=fn;
}
}
addEventListener(my$("btn"),"click",function () {
console.log("哦1");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦2");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦3");
});
总结绑定事件的区别:
addEventListener();
attachEvent()
相同点: 都可以为元素绑定事件
不同点:
1.方法名不一样
2.参数个数不一样addEventListener三个参数,attachEvent两个参数
3.addEventListener 谷歌,火狐,IE11支持,IE8不支持
attachEvent 谷歌火狐不支持,IE11不支持,IE8支持
4.this不同,addEventListener 中的this是当前绑定事件的对象
attachEvent中的this是window
5.addEventListener中事件的类型(事件的名字)没有on
attachEvent中的事件的类型(事件的名字)有on
为元素解绑事件
第一种方式:
对象.on事件名字=事件处理函数--->绑定事件
对象.on事件名字=null;
<input type="button" name="" value="点击" id="btn">
<input type="button" name="" value="干掉第一个" id="btn2">
var btn=document.getElementById("btn");
//对象.on事件的名字=事件的处理函数-------常用的绑定事件方法
btn.onclick=function ( ){
console.log("第一个");
};
var btn2=document.getElementById("btn2");
btn2.onclick=function ( ){
//解绑事件
btn.onclick=null;
};
第二种方式:
对象.addEventListener("没有on的事件类型",命名函数,false);---->绑定事件
对象.removeEventListener("没有on的事件类型",函数名字,false)
function f1 () {
console.log("第一个");
}
function f2 () {
console.log("第二个");
}
var btn=document.getElementById("btn");
btn.addEventListener("click",f1,false);
btn.addEventListener("click",f2,false);
//点击第二个按钮把第一个按钮的第一个点击事件解绑
var btn2=document.getElementById("btn2");
btn2.onclick=function () {
//解绑事件的时候,需要在绑定事件的时候使用命名函数
btn.removeEventListener("click",f1,false);
};
第三种方式---->针对IE8
对象.attachEvent("on事件类型",命名函数)----->绑定事件(针对IE8)
对象.detachEvent("on事件类型",函数名字)
function f1 () {
console.log("第一个");
}
function f2 () {
console.log("第二个");
}
var btn=document.getElementById("btn");
btn.attachEvent("onclick",f1);
btn.attachEvent("onclick",f2);
//点击第二个按钮把第一个按钮的第一个点击事件解绑
var btn2=document.getElementById("btn2");
btn2.onclick=function () {
//解绑事件的时候,需要在绑定事件的时候使用命名函数
btn.detachEvent("onclick",f1);
};
注意:用什么方式绑定事件,就应该用对应的方式解绑事件
绑定事件和解绑事件的兼容代码
<body>
<input type="button" name="" value="点击" id="btn">
<input type="button" name="" value="干掉第一个" id="btn2">
<script type="text/javascript">
//绑定事件的兼容代码
function addEventListener(element,type,fn) {
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}else{
element["on"+type]=fn;
}
}
//解绑事件的兼容代码
//为任意的一个元素,解绑对应的事件
function removeEventListener(element,type,fn) {
if (element.removeEventListener) {
element.removeEventListener(type,fn,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,fn);
}else{
element["on"+type]=null;
}
}
//测试
function f1() {
console.log("第一个");
}
function f2() {
console.log("第二个");
}
var btn=document.getElementById("btn");
addEventListener(btn,"click",f1);
addEventListener(btn,"click",f2);
var btn2=document.getElementById("btn2");
btn2.onclick=function () {
removeEventListener(btn,"click",f1);
};
</script>
</body>
3、事件的三个阶段
-
捕获阶段====>从外向内
-
当前目标阶段====>最开始选择的那个
-
冒泡阶段====>从里向外
addEventListener("没有on的事件类型",事件处理函数,控制事件阶段的) ,有三个参数,那么第三个参数就是控制事件阶段的,事件对象.eventPhase属性可以查看事件触发时所处的阶段。
如果这个属性的值是:
1---->捕获阶段
2---->目标阶段
3---->冒泡
一般默认都是冒泡阶段,很少用捕获阶段 ,所以addEventListener()第三个参数通常是false。
<style>
#dv1 {
width: 300px;
height: 200px;
background-color: red;
}
#dv2 {
width: 250px;
height: 150px;
background-color: green;
}
#dv3 {
width: 200px;
height: 100px;
background-color: blue;
}
</style>
<body>
<div id="dv1">
<div id="dv2">
<div id="dv3"></div>
</div>
</div>
</body>
<script>
function my$(id){
return document.getElementById(id);
}
//同时注册点击事件
var objs = [my$("dv3"), my$("dv2"), my$("dv1")];
//遍历注册事件
objs.forEach(function (ele) {
//为每个元素绑定事件
ele.addEventListener("click", function (e) {
console.log(this.id+"====>"+e.eventPhase);
}, true);
});
</script>
注意:捕获阶段和冒泡阶段不会同时存在
事件冒泡
事件冒泡:多个元素嵌套,有层次关系,这些元素都注册了相同的事件,如果里面的元素的事件触发了,外面的元素的该事件自动的触发了,我们要阻止事件冒泡
阻止事件冒泡的方法
window.event.cancelBubble=true; IE特有的,谷歌支持,火狐不支持
e.stopPropagation(); 谷歌和火狐支持
my$("dv1").onclick=function () {
console.log(this.id);
};
my$("dv2").onclick=function () {
console.log(this.id);
window.event.cancelBubble=true;
};
//事件处理参数对象
my$("dv3").onclick=function (e) {
console.log(this.id);
//阻止事件冒泡
//e.stopPropagation();
console.log(e);
};
4、事件对象的属性和方法
-
event.type 获取事件类型
-
clientX/clientY 所有浏览器都支持,窗口位置
-
pageX/pageY IE8以前不支持,页面位置
-
event.target || event.srcElement 用于获取触发事件的元素
-
event.preventDefault() 取消默认行为
案例:为同一个元素绑定多个不同事件指向同一事件处理函数
<body>
<input type="button" value="按钮" id="btn"/>
<script>
function my$(id){
return document.getElementById(id);
}
//为同一个元素绑定多个不同的事件,指向相同的事件处理函数
my$("btn").onclick = f1;
my$("btn").onmouseover = f1;
my$("btn").onmouseout = f1;
function f1(e) {
switch (e.type) {
case "click":
alert("我是按钮");
break;
case "mouseover":
this.style.backgroundColor = "red";
break;
case "mouseout":
this.style.backgroundColor = "green";
break;
}
}