添加事件处理程序
有三种方式。
- html指定事件处理程序
<body onclick="sayHi()">
hello world
<script>
function sayHi(){
console.log('hi~');
}
</script>
</body>
通过window.event
访问事件对象
- DOM0级事件处理程序
<body>
hello world
<script>
document.body.onclick = function(){
console.log('hi~');
}
</script>
</body>
事件处理程序的第一个参数就是事件对象,当然也可以通过window.event
访问事件对象
- DOM2级事件处理程序
<body>
hello world
<script>
function sayHi(){
console.log('hi~')
}
document.body.addEventListener('click',sayHi,false);
</script>
</body>
事件处理程序的第一个参数就是事件对象,当然也可以通过window.event
访问事件对象
跨浏览器添加事件处理程序
var EventUtil = {
addHandler:function(elm,type,handler){
if(elm.addEventListener){
elm.addEventListener(type,handler,false);
}
// else if(elm.attachEvent){
// elm.attachEvent('on'+type,handler);
// }
else {
elm['on'+type] = handler;
}
},
removeHandler:function(elm,type,handler){
if(elm.removeEventListener){
elm.removeEventListener(type,handler,false);
}
// else if(elm.detachEvent){
// elm.detachEvent('on'+type,handler);
// }
else {
elm['on'+type] = null;
}
},
getEvent:function(event){
return window.event || event;
},
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue = false;
}
},
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble = true;
}
}
}
事件流
<!DOCTYPE html>
<html>
<body>
<ul>
<li id='sz'>深圳</li>
<li id='nj'>南京</li>
<li id='hz'>杭州</li>
</ul>
<script>
function htmlHandler(e){
console.log(e.target,e.currentTarget)
}
function bodyHandler(e){
console.log(e.target,e.currentTarget)
}
function ulHandler(e){
console.log(e.target,e.currentTarget)
}
function liHandler(e){
console.log(e.target,e.currentTarget)
}
document.documentElement.onclick = htmlHandler;
document.body.onclick = bodyHandler;
document.querySelector('ul').onclick = ulHandler;
document.querySelector('li#sz').onclick=liHandler;
</script>
</body>
</html>
所以,事件对象的target
属性和currentTarget
属性的区别很明显,
target
事件的目标对象currentTarget
处理当前事件的对象
说到这儿,就不得不来了解下 事件委托 了。
事件委托
<ul>
<li id='sz'>深圳</li>
<li id='nj'>南京</li>
<li id='hz'>杭州</li>
</ul>
- 不委托
var li0 = document.querySelector('#sz');
var li1 = document.querySelector('#nj');
var li2 = document.querySelector('#hz');
const li0Handler = function(e){
console.log(e.type);
}
const li1Handler = function(e){
console.log(e.target);
}
const li2Handler = function(e){
console.log(e.target.textContent);
}
li0.onclick = li0Handler;
li1.onclick = li1Handler;
li2.onclick = li2Handler;
这时,事件对象的target
属性值和currentTarget
属性值是相同的
- 委托
var ul = document.querySelector('ul');
const ulHandler = function(e){
switch(e.target.id){
case 'sz': console.log(e.type);break;
case 'nj': console.log(e.target);break;
case 'hz': console.log(e.target.textContent);break;
}
}
ul.onclick = ulHandler;
事件委托,就是 发生在 子元素 上的事,交给父元素或者祖父元素或者更外层的元素处理。
这时,target
和currentTarget
就不相等了。
事件委托,省时省空间,何乐不为!