事件对象
当事件发生时,接收器收到事件消息,发送给事件处理器,事件处理器负责事件消息的处理,生成event对象,驱动绑定监听器的节点执行。
我的想法所有事件通知的信息都在事件对象里。
DOM事件对象通用属性
type属性
//使用target绑定多个事件
let oDiv = document.getElementsByTagName('div')[0];
function handler(e) {
switch (e.type) {
case 'click': e.target.style.background = 'black';
break;
case 'mouseover': e.target.style.background = '#ddd';
break;
case 'mouseout': e.target.style.background = '#333';
break;
}
}
oDiv.onclick = handler;
oDiv.onmouseover = handler;
oDiv.onmouseout = handler;
target属性
//发现target属性是指向点击的元素
let oDiv1 = document.getElementsByTagName('div')[0];
let oDiv2 = document.getElementsByClassName('box2')[0];
oDiv1.addEventListener('click', (e) => console.log(e.target), false);
currentTarget属性
let oDiv1 = document.getElementsByTagName('div')[0];
let oDiv2 = document.getElementsByClassName('box2')[0];
oDiv1.addEventListener('click', (e) => console.log(e.currentTarget), false);
preventDefault()
//取消元素的默认行为事件
link.onclick = function handler(e){
e.preventDefault();
}
stopPropagation()
let oDiv1 = document.getElementsByTagName('div')[0];
let oDiv2 = document.getElementsByClassName('box2')[0];
oDiv2.addEventListener('click', (e) => {
console.log(e.currentTarget);
e.stopPropagation(); //阻止事件的冒泡或捕获
}, false);
oDiv1.addEventListener('click', (e) => console.log(e.currentTarget), false);
IE事件对象
- IE有着不同的访问事件对象的方式。
event对象不是在事件处理程序中,而是在window对象中。而且有其独有的属性和方法。
var oDiv1 = document.getElementsByTagName('div')[0];
oDiv1.attachEvent('onclick', text);
function text (){
var e = window.event;
console.log(e.type, e.srcElement.id);
}
srcElement属性
-
cancelBubble属性
-
returnValue属性
布尔值。false取消默认事件。
默认事件
案例阻止其默认事件,但是显示为块级元素时,它的其他部分可以跳转。
<body>
<a href="https://www.baidu.com" target="_blank">
<div>百度</div>
</a>
<script src="/js/utility.js"></script>
<script>
var oDiv = document.getElementsByTagName('div')[0];
EventUtil.addHandler(oDiv, 'click', function(e){
EventUtil.cancelDefault();
});
</script>
</body>