74
74
* @returns {Object } jQuery object.
75
75
*/
76
76
77
- var jqCache = { } ,
77
+ var jqCache = JQLite . cache = { } ,
78
78
jqName = JQLite . expando = 'ng-' + new Date ( ) . getTime ( ) ,
79
79
jqId = 1 ,
80
80
addEventListenerFn = ( window . document . addEventListener
@@ -122,15 +122,15 @@ function JQLitePatchJQueryRemove(name, dispatchThis) {
122
122
fireEvent = dispatchThis ,
123
123
set , setIndex , setLength ,
124
124
element , childIndex , childLength , children ,
125
- fns , data ;
125
+ fns , events ;
126
126
127
127
while ( list . length ) {
128
128
set = list . shift ( ) ;
129
129
for ( setIndex = 0 , setLength = set . length ; setIndex < setLength ; setIndex ++ ) {
130
130
element = jqLite ( set [ setIndex ] ) ;
131
131
if ( fireEvent ) {
132
- data = element . data ( 'events' ) ;
133
- if ( ( fns = data && data . $destroy ) ) {
132
+ events = element . data ( 'events' ) ;
133
+ if ( ( fns = events && events . $destroy ) ) {
134
134
forEach ( fns , function ( fn ) {
135
135
fn . handler ( ) ;
136
136
} ) ;
@@ -185,19 +185,35 @@ function JQLiteDealoc(element){
185
185
}
186
186
}
187
187
188
+ function JQLiteUnbind ( element , type , fn ) {
189
+ var events = JQLiteData ( element , 'events' ) ,
190
+ handle = JQLiteData ( element , 'handle' ) ;
191
+
192
+ if ( ! handle ) return ; //no listeners registered
193
+
194
+ if ( isUndefined ( type ) ) {
195
+ forEach ( events , function ( eventHandler , type ) {
196
+ removeEventListenerFn ( element , type , eventHandler ) ;
197
+ delete events [ type ] ;
198
+ } ) ;
199
+ } else {
200
+ if ( isUndefined ( fn ) ) {
201
+ removeEventListenerFn ( element , type , events [ type ] ) ;
202
+ delete events [ type ] ;
203
+ } else {
204
+ arrayRemove ( events [ type ] , fn ) ;
205
+ }
206
+ }
207
+ }
208
+
188
209
function JQLiteRemoveData ( element ) {
189
210
var cacheId = element [ jqName ] ,
190
211
cache = jqCache [ cacheId ] ;
191
212
192
213
if ( cache ) {
193
- if ( cache . bind ) {
194
- forEach ( cache . bind , function ( fn , type ) {
195
- if ( type == '$destroy' ) {
196
- fn ( { } ) ;
197
- } else {
198
- removeEventListenerFn ( element , type , fn ) ;
199
- }
200
- } ) ;
214
+ if ( cache . handle ) {
215
+ cache . events . $destroy && cache . handle ( { } , '$destroy' ) ;
216
+ JQLiteUnbind ( element ) ;
201
217
}
202
218
delete jqCache [ cacheId ] ;
203
219
element [ jqName ] = undefined ; // ie does not allow deletion of attributes on elements.
@@ -499,8 +515,8 @@ forEach({
499
515
} ;
500
516
} ) ;
501
517
502
- function createEventHandler ( element ) {
503
- var eventHandler = function ( event ) {
518
+ function createEventHandler ( element , events ) {
519
+ var eventHandler = function ( event , type ) {
504
520
if ( ! event . preventDefault ) {
505
521
event . preventDefault = function ( ) {
506
522
event . returnValue = false ; //ie
@@ -530,8 +546,12 @@ function createEventHandler(element) {
530
546
return event . defaultPrevented ;
531
547
} ;
532
548
533
- forEach ( eventHandler . fns , function ( fn ) {
534
- fn . call ( element , event ) ;
549
+ forEach ( events [ type || event . type ] , function ( fn ) {
550
+ try {
551
+ fn . call ( element , event ) ;
552
+ } catch ( e ) {
553
+ // Not much to do here since jQuery ignores these anyway
554
+ }
535
555
} ) ;
536
556
537
557
// Remove monkey-patched methods (IE),
@@ -548,7 +568,7 @@ function createEventHandler(element) {
548
568
delete event . isDefaultPrevented ;
549
569
}
550
570
} ;
551
- eventHandler . fns = [ ] ;
571
+ eventHandler . elem = element ;
552
572
return eventHandler ;
553
573
}
554
574
@@ -563,61 +583,45 @@ forEach({
563
583
dealoc : JQLiteDealoc ,
564
584
565
585
bind : function bindFn ( element , type , fn ) {
566
- var bind = JQLiteData ( element , 'bind' ) ;
586
+ var events = JQLiteData ( element , 'events' ) ,
587
+ handle = JQLiteData ( element , 'handle' ) ;
567
588
589
+ if ( ! events ) JQLiteData ( element , 'events' , events = { } ) ;
590
+ if ( ! handle ) JQLiteData ( element , 'handle' , handle = createEventHandler ( element , events ) ) ;
568
591
569
- if ( ! bind ) JQLiteData ( element , 'bind' , bind = { } ) ;
570
592
forEach ( type . split ( ' ' ) , function ( type ) {
571
- var eventHandler = bind [ type ] ;
572
-
593
+ var eventFns = events [ type ] ;
573
594
574
- if ( ! eventHandler ) {
595
+ if ( ! eventFns ) {
575
596
if ( type == 'mouseenter' || type == 'mouseleave' ) {
576
- var mouseenter = bind . mouseenter = createEventHandler ( element ) ;
577
- var mouseleave = bind . mouseleave = createEventHandler ( element ) ;
578
597
var counter = 0 ;
579
598
599
+ events . mouseenter = [ ] ;
600
+ events . mouseleave = [ ] ;
580
601
581
602
bindFn ( element , 'mouseover' , function ( event ) {
582
603
counter ++ ;
583
604
if ( counter == 1 ) {
584
- mouseenter ( event ) ;
605
+ handle ( event , 'mouseenter' ) ;
585
606
}
586
607
} ) ;
587
608
bindFn ( element , 'mouseout' , function ( event ) {
588
609
counter -- ;
589
610
if ( counter == 0 ) {
590
- mouseleave ( event ) ;
611
+ handle ( event , 'mouseleave' ) ;
591
612
}
592
613
} ) ;
593
- eventHandler = bind [ type ] ;
594
614
} else {
595
- eventHandler = bind [ type ] = createEventHandler ( element ) ;
596
- addEventListenerFn ( element , type , eventHandler ) ;
615
+ addEventListenerFn ( element , type , handle ) ;
616
+ events [ type ] = [ ] ;
597
617
}
618
+ eventFns = events [ type ]
598
619
}
599
- eventHandler . fns . push ( fn ) ;
620
+ eventFns . push ( fn ) ;
600
621
} ) ;
601
622
} ,
602
623
603
- unbind : function ( element , type , fn ) {
604
- var bind = JQLiteData ( element , 'bind' ) ;
605
- if ( ! bind ) return ; //no listeners registered
606
-
607
- if ( isUndefined ( type ) ) {
608
- forEach ( bind , function ( eventHandler , type ) {
609
- removeEventListenerFn ( element , type , eventHandler ) ;
610
- delete bind [ type ] ;
611
- } ) ;
612
- } else {
613
- if ( isUndefined ( fn ) ) {
614
- removeEventListenerFn ( element , type , bind [ type ] ) ;
615
- delete bind [ type ] ;
616
- } else {
617
- arrayRemove ( bind [ type ] . fns , fn ) ;
618
- }
619
- }
620
- } ,
624
+ unbind : JQLiteUnbind ,
621
625
622
626
replaceWith : function ( element , replaceNode ) {
623
627
var index , parent = element . parentNode ;
0 commit comments