OSDN Git Service

Version 0.6.5
[pettanr/clientJs.git] / 0.6.x / js / core / 12_XDomEvent.js
1 /**
2  * use X.Callback
3  */
4 var X = X || {};
5
6 X.DomEvent = {
7         add :
8                 document.addEventListener ?
9                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
10                                 var callback;
11                                 if( typeof arg2 === 'function' ){
12                                         callback = X.Callback.create( element, arg2, arg3 );
13                                 } else {
14                                         callback = X.Callback.create( arg2, arg3, arg4 );
15                                 };
16                                 callback.c   = X.DomEvent._callback; // override
17                                 element.addEventListener( type, callback, false );
18                         }) :
19                 document.attachEvent ?
20                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
21                                 var callback;
22                                 if( typeof arg2 === 'function' ){
23                                         callback = X.Callback.create( element, arg2, arg3 );
24                                 } else {
25                                         callback = X.Callback.create( arg2, arg3, arg4 );
26                                 };
27                                 callback.c = X.DomEvent._callback; // override
28                                 callback.e = element;
29                                 element.attachEvent( 'on' + type, callback );
30                         }) :
31                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
32                                 var callback, dom0, helper, list;
33                                 if( typeof arg2 === 'function' ){
34                                         callback = X.Callback.create( element, arg2, arg3 );
35                                 } else {
36                                         callback = X.Callback.create( arg2, arg3, arg4 );
37                                 };
38                                 if( X.DomEvent.helper( element, type, callback ) === false ){
39                                         callback.c   = X.DomEvent._callback; // override
40                                         return;
41                                 };
42                                 dom0 = X.DomEvent.Dom0;
43                                 helper = dom0.find( element, type );
44                                 if( helper ){
45                                         list = helper.list;
46                                         if( list.indexOf( callback ) === -1 ) list[ list.length ] = callback;
47                                 } else {
48                                         dom0.LIST[ dom0.LIST.length ] = new dom0.Helper( element, type, callback );
49                                 };
50                         }),
51         remove :
52                 document.removeEventListener ?
53                         (function( element, type, arg2, arg3 ){
54                                 var callback = X.Callback.find( arg2, arg3 );
55                                 if( callback ){
56                                         element.removeEventListener( type, callback, false );
57                                         X.Callback._correct( callback );                                        
58                                 };
59                         }) :
60                 document.detachEvent ?
61                         (function( element, type, arg2, arg3 ){
62                                 var callback = X.Callback.find( arg2, arg3 );
63                                 if( callback ){
64                                         element.detachEvent( 'on' + type, callback );
65                                         X.Callback._correct( callback );
66                                 };
67                         }) :
68                         (function( element, type, arg2, arg3 ){
69                                 var dom0 = X.DomEvent.Dom0,
70                                         t    = dom0.find( element, type ),
71                                         c    = X.Callback.find( arg2, arg3 ),
72                                         i;
73                                 if( t && c ){
74                                         i = t.list.indexOf( c );
75                                         if( i !== -1 ){
76                                                 t.list.splice( i, 1 );
77                                                 X.Callback._correct( c );
78                                         };
79                                         if( t.list.length === 0 ){
80                                                 t.elm[ 'on' + t.type ] = dom0.emptyFunc;
81                                                 t.elm[ 'on' + t.type ] = '';
82                                                 c = X.Callback.find( t );
83                                                 X.Callback._correct( c );
84                                                 dom0.LIST.splice( dom0.LIST.indexOf( t ), 1 );
85                                                 delete t.elm;
86                                                 delete t.type;
87                                                 delete t.list;
88                                         };
89                                 };
90                         }),
91         _callback :
92                 window.addEventListener ?
93                         (function(){
94                                 var f = this,
95                                         e = f.a[ 0 ],
96                                         r = f.callback.call( f.context, new X.DomEvent.xEvent( e ) );
97                                 if( r !== false ) return r;
98                                 e.preventDefault();
99                                 e.stopPropagation();
100                                 return false;
101                         }) :
102                 document.attachEvent ?
103                         (function(){
104                                 var f = this,
105                                         e = window.event,
106                                         x = f.context,
107                                         r = f.callback.call( x, new X.DomEvent.xEvent( e, f.e ));
108                                 if( r !== false ) return r;
109                                 e.cancelBubble = true;
110                                 e.returnValue  = false;
111                                 return r;
112                         }) :
113                         (function(){
114                                 var f = this,
115                                         e = window.event,
116                                         x = f.context,
117                                         r = f.callback.call( x, new X.DomEvent.xEvent( e, x.elm ));
118                                 if( r !== false ) return r;
119                                 e.cancelBubble = true;
120                                 e.returnValue  = false;
121                                 return r;
122                         })
123 };
124 if( window.addEventListener ){
125         X.DomEvent.xEvent = function( e ){
126                 this._event        = e;
127                 this.type          = e.type;
128                 this.target        = e.target;
129                 this.currentTarget = e.currentTarget;
130                 this.relatedTarget = e.relatedTarget;
131                 this.eventPhase    = e.eventPhase;
132                 
133                 this.clientX       = e.clientX;
134                 this.clientY       = e.clientY;
135                 this.screenX       = e.screenX;
136                 this.screenY       = e.screenY;
137                 
138                 this.keyCode       = e.keyCode;
139                 this.altKey        = e.altKey;
140                 this.ctrlKey       = e.ctrlKey;
141                 this.shiftKey      = e.shiftKey;
142                 
143                 this.wheelDelta    = e.wheelDelta;
144         };
145 } else {
146         X.DomEvent.xEvent = function( e, element ){
147                 this._event        = e;
148                 this.type          = e.type;
149                 this.target        = e.srcElement;
150                 this.currentTarget = element;
151                 this.relatedTarget = e.formElement ? e.formElement : e.toElement;
152                 this.eventPhase    = e.srcElement === element ? 2: 3;
153                 
154                 this.clientX       = e.clientX;
155                 this.clientY       = e.clientY;
156                 this.screenX       = e.screenX;
157                 this.screenY       = e.screenY;
158                 
159                 this.keyCode       = e.keyCode;
160                 this.altKey        = e.altKey;
161                 this.ctrlKey       = e.ctrlKey;
162                 this.shiftKey      = e.shiftKey;
163                 
164                 this.wheelDelta    = e.wheelDelta;
165         };
166 };
167 if( !document.addEventListener && !document.attachEvent ){
168         X.DomEvent.Dom0 = {
169                 LIST      : [],
170                 emptyFunc : new Function(),
171                 find      : function( element, type ){
172                         var list = X.DomEvent.Dom0.LIST,
173                                 i    = list.length,
174                                 helper;
175                         for( ; i < l; ){
176                                 helper = list[ --i ];
177                                 if( helper.elm === element && helper.type === type ) return helper;
178                         };
179                 },
180                 Helper : function( elm, type, callback ){
181                         this.elm  = elm;
182                         this.type = type;
183                         this.list = [ callback ];
184                         
185                         callback   = elm[ 'on' + type ] = X.Callback.create( this );
186                         callback.c = X.DomEvent._callback; // override
187                 }
188         };
189         X.DomEvent.Dom0.Helper.prototype.handleEvent = function(e){
190                 //e = e.copy();
191                 var list = this.list,
192                         i    = list.length,
193                         cancel;
194                 for( ; i; ){
195                         if( list[ --i ]( e ) === false ) cancel = false;
196                 };
197                 return cancel;
198         };
199 };