添加事件三种方式
方式一:
1.通过onxxx的方式来添加
注意点: 由于是给属性赋值, 所以后赋值的会覆盖先赋值
oBtn.onclick = function () {
alert("666");
}
oBtn.onclick = function () {
alert("777");
}
let obj = {};
obj.say = function () {
console.log("123");
}
obj.say = function () {
console.log("456");
}
obj.say();
方式二:
2.通过addEventListener方法添加
注意点:
1.事件名称不需要添加on
2.后添加的不会覆盖先添加的
3.只支持最新的浏览器IE9
oBtn.addEventListener("click", function () {
alert("666");
});
oBtn.addEventListener("click", function () {
alert("777");
});
方式三:
3.通过attachEvent方法添加
注意点:
1.事件名称必须加上on
2.后添加的不会覆盖先添加的
3.只支持低版本的浏览器
oBtn.attachEvent("onclick", function () {
alert("666");
});
oBtn.attachEvent("onclick", function () {
alert("777");
});
兼容写法
addEvent(oBtn, "click", function () {
alert("666");
})
addEvent(oBtn, "click", function () {
alert("777");
})
function addEvent(ele, name, fn) {
if(ele.attachEvent){
ele.attachEvent("on"+name, fn);
}else{
ele.addEventListener(name, fn);
}
}
事件对象
事件对象就是一个系统自动创建的一个对象
当注册的事件被触发的时候, 系统就会自动创建事件对象
事件对象的注意点:
在高级版本的浏览器中, 会自动将事件对象传递给回到函数
在低级版本的浏览器中, 不会自动将事件对象传递给回调函数
在低级版本的浏览器中, 需要通过window.event来获取事件对象
/*
var oBtn = document.getElementById("btn");
oBtn.onclick = function (event) {
// 兼容性的写法
event = event || window.event;
// alert("666");
console.log(event);
console.log(typeof event);
}
*/
let oA = document.querySelector("a");
oA.onclick = function (event) {
// 兼容性的写法
event = event || window.event;
alert("666");
// 阻止默认行为
return false; // 企业开发推荐
// 注意点: preventDefault方法只支持高级版本的浏览器
// event.preventDefault();
// event.returnValue = false; // IE9以下的浏览器
}
事件执行的三个阶段
1.事件的三个阶段
1.1.捕获阶段(从外向内的传递事件)
1.2.当前目标阶段
1.3.冒泡的阶段(从内向外的传递事件)
2.注意点:
三个阶段只有两个会被同时执行
要么捕获和当前, 要么当前和冒泡
3.为什么要么只能是捕获和当前, 要么只能是当前和冒泡?
这是JS处理事件的历史问题
早期各大浏览器厂商为占领市场, 以及对事件的理解不同
后续W3C为了兼容, 将两种方式都纳入标准
1.如何设置事件到底是捕获还是冒泡?
只能通过addEventListener方法, 这个方法接收三个参数
第一个参数: 事件的名称
第二个参数: 回调函数
第三个参数: false冒泡 / true 捕获
注意点:
onXxx的属性, 不接收任何参数, 所以默认就是冒泡
attachEvent方法, 只能接收两个参数, 所以默认就是冒泡
<style>
*{
margin: 0;
padding: 0;
}
.father{
width: 300px;
height: 300px;
background: red;
}
.son{
width: 150px;
height: 150px;
background: blue;
}
</style>
<div class="father">
<div class="son"></div>
</div>
let oFDiv = document.querySelector(".father");
let oSDiv = document.querySelector(".son");
oFDiv.addEventListener("click", function () {
console.log("father");
}, false);
oSDiv.addEventListener("click", function () {
console.log("son");
}, false);
oFDiv.onclick = function () {
console.log("father");
}
oSDiv.onclick = function () {
console.log("son");
}
true false 决定执行顺序
IE 6.0:
div -> body -> html -> document
其他浏览器:
div -> body -> html -> document -> window
注意:
不是所有的事件都能冒泡,以下事件不冒泡:blur、focus、load、unload