1、使用Event对象
<body>
<div class="box">
<div id="item">item</div>
</div>
</body>
<script>
let item=document.getElementById('item');
// 通过Event定义一个自定义的事件名
let et=new Event('tip');
// 通过addEventListener给该事件添加回调函数
item.addEventListener('tip',function(){
alert('item=>tip1')
});
item.addEventListener('tip',function(){
alert('item=>tip2')
});
// 通过调用dom元素的dispatchEvent方法触发(参数是Event对象)
item.dispatchEvent(et);
</script>
这样,触发时会alert出tip1 和 tip2
2、使用CustomEvent
<script>
let item=document.getElementById('item');
//CustomEvent是Event的继承类,可以进行更多的配置
let et=new CustomEvent('tip',{
//detail中的数据可以在回调函数的event参数中读取到
detail:{
msg:'this is event'
},
bubbles: true, //是否冒泡
cancelable: false //是否触发默认事件
});
item.addEventListener('tip',function(e){
console.log(e);
alert('item=>tip1')
});
item.onclick=function(){
item.dispatchEvent(et);
}
</script>
把tip回调的e打印出来,可以获取到customEvent的detail
3、使用createEvent注册事件
let item=document.getElementById('item');
let ev=document.createEvent('HTMLEvents');
ev.initEvent('tip');
item.addEventListener('tip',function(){
alert('tip')
});
item.dispatchEvent(ev);
首先通过createEvent创建一个新的事件对象,参数有以下几个(一般使用HTMLEvents)
参数 | 事件接口 | 初始化方法 |
---|---|---|
HTMLEvents | HTMLEvent | initEvent() |
MouseEvents | MouseEvent | initMouseEvent() |
UIEvents | UIEvent | initUIEvent() |
使用了createEvent之后,需要对事件初始化initEvent() (不同的参数对应不同的初始化方法)
initEvent(eventName,canBubble, preventDefault)三个参数,
分别是事件名称,是否冒泡,是否阻止默认操作
之后就可以通过addEventListener添加事件回调和dispatchEvent触发事件了
4、通过构造一个事件类
class MyEvent{
constructor(opts){
this.eventList={};
}
addEvent(eventName,fn){
if(!eventName||typeof eventName!=='string'){
return
}
if(!fn||typeof fn!=='function'){
return
}
if(!this.eventList[eventName]){
this.eventList[eventName]=[]
}
this.eventList[eventName].push(fn);
}
removeEvent(eventName){
if(!eventName||!this.eventList[eventName]){
return
}
this.eventList[eventName]='';
}
fireEvent(eventName){
if(!eventName||!this.eventList[eventName]){
return
}
let eventLen=this.eventList[eventName].length;
//依次执行放入数组中的事件回调函数
for(let i=0;i<eventLen;i++){
this.eventList[eventName][i].call(null);
}
}
}
let ev=new MyEvent();
ev.addEvent('tip',function(){
alert('tip')
});
ev.addEvent('tip',function(){
alert('tip2')
});
ev.fireEvent('tip');
这样会依次弹出tip和tip2