首页 > 代码库 > js高级技巧----自定义事件
js高级技巧----自定义事件
自定义事件
原本的事件处理的原理:事件是javascript与浏览器交互的主要途径。
事件是一种叫做观察者的设计模式
观察者模式由两类对象组成:主体和观察者。
主体用于发布事件;
观察者通过订阅这些事件来观察该主体。
自定义事件的原理:
将事件处理程序保存在一个数组中;
当添加事件的时候,我们push进去这个事件处理函数;
当我们执行的时候,从头遍历这个数组中的每个事件处理函数,并执行。
自定义事件应该具有的内容:
1.一个handler对象,对象中保存着存放事件处理函数的数组
handler = {
‘click’ : [func1,func2],
‘my’ : [func3,func4]
}
2.一个addhandler函数,用于添加事件处理函数
3.一个removehandler函数,用于删除事件处理函数
4.一个fire函数,用于执行所添加的函数。
注:使用原型模式来创建自定义事件对象。
代码如下:
1 function EventTarget(){ 2 /* 3 * handlers:用来存储时间处理程序 4 */ 5 this.handlers = {}; 6 } 7 EventTarget.prototype = { 8 constructor : EventTarget, 9 /*10 * addHandler:用于注册给定类型事件的事件处理程序11 * type:自定义的事件类型,任意字符串12 * handler:自定义的事件处理函数13 */14 addHandler : function( type,handler ){15 if( typeof this.handlers[type] == "undefined" ){16 this.handlers[type] = [];17 }18 this.handlers[type].push( handler );19 },20 /*21 * fire:用于触发一个事件22 * event:是一个事件对象,可以自定义它拥有的属性23 */24 fire : function( event ){25 if( !event.target ){26 event.target = this;27 }28 if( this.handlers[event.type] instanceof Array){29 var handlers = this.handlers[event.type];30 for( var i=0,len=handlers.length;i<len;i++ ){31 handlers[i]( event );32 }33 }34 },35 /*36 * removeHandler:用于注销某个事件类型的事件处理程序37 */38 removeHandler : function( type,handler ){39 if( this.handlers[type] instanceof Array ){40 var handlers = this.handlers[type];41 for( var i=0,len=handlers.length;i<len;i++ ){42 if( handlers[i] == handler){43 break;44 }45 }46 handlers.splice( i,1 );47 }48 }49 }
扩展:(详细参见http://www.zhangxinxu.com/wordpress/?p=2330)
DOM自定义事件:如为某个元素添加一个自定义的事件。
基本格式如下:
var $ = function(el) {
return new _$(el);
};
var _$ = function(el) {
this.el = el;
};
_$.prototype = {
constructor: this,
addEvent: function() { // ...},
fireEvent: function() { // ... },
removeEvent: function() { // ... }
}
于是我们就可以使用类似$(dom).addEvent()的语法为元素添加事件
重点:fireEvent()方法
1.对于标准浏览器
eve = document.createEvent( ‘HTMLEvents’ ):返回新创建的event对象
eve.initEvent( eventType,canBubble ,preventDefault ):初始化对象
element.dispatchEvent( eve ):在元素上触发事件
(注:关于creatEvent()更多说明参考:http://blog.csdn.net/jxst051665/article/details/3931598
2.对于IE浏览器
"propertychange"事件,就是属性改变即触发的事件
代码地址:https://github.com/xiaoxiaojing/practiseCode/blob/master/advancedSkills/custom_event.js
参考文章:http://www.zhangxinxu.com/wordpress/?p=2330
参考书籍:《js高级程序设计》
js高级技巧----自定义事件