js自定义事件的简单实现

在写这段代码之后,本人使用过jQuery这个库,一直对jQuery的自定义事件有疑惑,就看了看jQuery的源码,廓然开朗。

jQuery代码实现和触发自定义实现如下: 

1 jQuery的定义方式:
2 $(dom).bind('data-change',function(){//dom为一个html元素
3       alert("asd");     
4 })
5 
6 jQuery使用方式 : 
7 $(dom).trigger('init-change',[data]);

 

但内部机制是怎么触发这个事件的呢?原来jQuery通过的是缓存这些自定义事件,我就自己实现了一把,下面是我的代码:

 

 1 var Dojo = function(selecter,context){
 2     return new this.init(selecter,context);//创建一个新的对象
 3 }
 4 Dojo.prototype.event = {};
 5 Dojo.prototype.init  = function(selecter,context){
 6     this.gid = 0;
 7     var dom  = this.getDom(selecter); 
 8     this.dom = dom;
 9     this.dom.gid = this.gid++;
10     return this;
11 }
12 var events = "click mousedown mouseup mouseenter mouseout focus blur keydown keypress keyup".split(' ');
12 Dojo.prototype.getDom = function(selecter){ 13 var dom = document.getElementById(selecter) || null; 14 return [dom]; 15 } 16 Dojo.prototype.addEvent = function(eventName,fn){//存放自定义的事件
17 if(!this.event[eventName]){ 18 this.event[eventName] = []; 19 } 20 this.event[eventName].push( fn ); 21 } 22 //Dojo工具类 23 Dojo.Util = {}; 24 Dojo.Util.isFunction = function(fn){ 25 return Object.prototype.toString.call( fn ).slice(8,-1) === 'Function'; 26 } 27 Dojo.Util.ToArray = function(args){ 28 return Array.prototype.slice.call( args , 0 ); 29 } 30 //简单实现事件的绑定 31 Dojo.prototype.click = function(fn){ 32 this.event[this.dom.gid] = this.event[this.dom.gid] || []; 33 var i = j = 0; 34 var self = this; 35 if(Dojo.Util.isFunction( fn )){ 36 for(;i<this.dom.length;i++){ 37 this.dom[i].addEventListener('click' , function(e,data){ 38 fn.call(self,e,data); 39 } ,false); 40 } 41 } 42 43 } 44 Dojo.prototype.trigger = function(eventName,data){ 45 var i = 0; 46 if(!this.event[eventName]){ 47 return; 48 } 49 for(len = this.event[eventName].length;i<len;i++){ 50 this.event[eventName][i].apply(this.dom,data); 51 } 52 return this; 53 } 54 Dojo.prototype.init.prototype = Dojo.prototype; 55 var dom = new Dojo('dom'); 56 //为创建的dom对象增加自定义函数 57 //这里面就增加了两个一样的事件 58 dom.addEvent("data-change",function(){ 59 console.log(arguments); 60 }); 61 dom.addEvent("data-change",function(){ 62 var arr; 63 arr = Dojo.Util.ToArray(arguments); 64 alert(arr); 65 }); 66 //click的时候触发事件 67 dom.click(function(e){ 68 this.trigger("data-change",['a','c','d']); 69 });

 

 

  

  

posted @ 2013-02-06 15:31  Ajson  阅读(216)  评论(0编辑  收藏  举报