通用triggerEvent方法

假设有一个id为testA的a元素,而后有如下代码(jquery已存在):javascript

$(document).ready(function(){
		
	$('#testA').on('testEvent', function(e,data1,data2,data3){
		console.log(e,data1,data2,data3);
	});
	
	var ba = document.getElementById('testA');
	ba.addEventListener('testEvent', function(e){
		console.log(e);
	});

});

即,用两种方法监听一个自定义事件:testEvent,再看看如何触发testEvent事件:java

document.addEventListener('click', function(e){
	$('#testA').trigger('testEvent', [2,3,4]);
});

实际上只有用on监听的才能起做用,就是说用jquery的方法trigger来发事件,就只能用jquery的方法on[或者其余.click(handler)之类的]来监听事件,而用js原生的addEventListener方法是不行的。jquery

为解决上面的问题,咱们能够这样:chrome

var evt = new Event('testEvent');
var ba = document.getElementById('testA');
ba.dispatchEvent(evt);

若是要带上自定义数据,能够这样:浏览器

var evt = new CustomEvent('testEvent',{detail:[2,3,4],a:1,b:3});
var ba = document.getElementById('testA');
ba.dispatchEvent(evt);

而后在事件处理函数中,能够经过event.detail来访问须要的数据,但event对象里面没有a,b属性,此处不清楚内部缘由,是否是只有一个detail属性可用也不得而知。更多的说明能够看这里:https://developer.mozilla.org/en-US/docs/Web/API/Document/createEvent函数

 

上面的方法在firefox,chrome上可行,但IE8及如下版本浏览器不可行,下面来处理IE的问题。spa

IE8发事件函数用的是fireEvent,建立事件对象用的是document.createEventObject(),看下面的代码:firefox

var evt = document.createEventObject();
evt.x = 100;
evt.y = 200;
evt.button = 1;
evt.z = 34;
ba.fireEvent('onclick', evt);

注意,我把testEvent换成了onclick,由于IE8不支持自定义事件。对象

接下来实现通用的发事件方法,若是要兼容IE8,那么就不能发送自定义事件:blog

function triggerEvent(element,eventType){
	var e;
	if(element.dispatchEvent){//正常状况
		e = new Event(eventType);
		element.dispatchEvent(e);
	}else if(element.fireEvent){//IE
		e = document.createEventObject();
		e.button = 1;
		element.fireEvent('on'+eventType,e);
	}else if(element['on'+eventType]){
		element['on'+eventType].call();
	}
}

上面的方法,若是在IE8及如下版本中运行是没法发送自定义事件的。若是容许用jquery的trigger方法,仍是用jquery比较方便。

相关文章
相关标签/搜索