7474 * @returns {Object } jQuery object.
7575 */
7676
77- var jqCache = { } ,
77+ var jqCache = JQLite . cache = { } ,
7878 jqName = JQLite . expando = 'ng-' + new Date ( ) . getTime ( ) ,
7979 jqId = 1 ,
8080 addEventListenerFn = ( window . document . addEventListener
@@ -122,15 +122,15 @@ function JQLitePatchJQueryRemove(name, dispatchThis) {
122122 fireEvent = dispatchThis ,
123123 set , setIndex , setLength ,
124124 element , childIndex , childLength , children ,
125- fns , data ;
125+ fns , events ;
126126
127127 while ( list . length ) {
128128 set = list . shift ( ) ;
129129 for ( setIndex = 0 , setLength = set . length ; setIndex < setLength ; setIndex ++ ) {
130130 element = jqLite ( set [ setIndex ] ) ;
131131 if ( fireEvent ) {
132- data = element . data ( 'events' ) ;
133- if ( ( fns = data && data . $destroy ) ) {
132+ events = element . data ( 'events' ) ;
133+ if ( ( fns = events && events . $destroy ) ) {
134134 forEach ( fns , function ( fn ) {
135135 fn . handler ( ) ;
136136 } ) ;
@@ -185,19 +185,35 @@ function JQLiteDealoc(element){
185185 }
186186}
187187
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+
188209function JQLiteRemoveData ( element ) {
189210 var cacheId = element [ jqName ] ,
190211 cache = jqCache [ cacheId ] ;
191212
192213 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 ) ;
201217 }
202218 delete jqCache [ cacheId ] ;
203219 element [ jqName ] = undefined ; // ie does not allow deletion of attributes on elements.
@@ -499,8 +515,8 @@ forEach({
499515 } ;
500516} ) ;
501517
502- function createEventHandler ( element ) {
503- var eventHandler = function ( event ) {
518+ function createEventHandler ( element , events ) {
519+ var eventHandler = function ( event , type ) {
504520 if ( ! event . preventDefault ) {
505521 event . preventDefault = function ( ) {
506522 event . returnValue = false ; //ie
@@ -530,8 +546,12 @@ function createEventHandler(element) {
530546 return event . defaultPrevented ;
531547 } ;
532548
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+ }
535555 } ) ;
536556
537557 // Remove monkey-patched methods (IE),
@@ -548,7 +568,7 @@ function createEventHandler(element) {
548568 delete event . isDefaultPrevented ;
549569 }
550570 } ;
551- eventHandler . fns = [ ] ;
571+ eventHandler . elem = element ;
552572 return eventHandler ;
553573}
554574
@@ -563,61 +583,45 @@ forEach({
563583 dealoc : JQLiteDealoc ,
564584
565585 bind : function bindFn ( element , type , fn ) {
566- var bind = JQLiteData ( element , 'bind' ) ;
586+ var events = JQLiteData ( element , 'events' ) ,
587+ handle = JQLiteData ( element , 'handle' ) ;
567588
589+ if ( ! events ) JQLiteData ( element , 'events' , events = { } ) ;
590+ if ( ! handle ) JQLiteData ( element , 'handle' , handle = createEventHandler ( element , events ) ) ;
568591
569- if ( ! bind ) JQLiteData ( element , 'bind' , bind = { } ) ;
570592 forEach ( type . split ( ' ' ) , function ( type ) {
571- var eventHandler = bind [ type ] ;
572-
593+ var eventFns = events [ type ] ;
573594
574- if ( ! eventHandler ) {
595+ if ( ! eventFns ) {
575596 if ( type == 'mouseenter' || type == 'mouseleave' ) {
576- var mouseenter = bind . mouseenter = createEventHandler ( element ) ;
577- var mouseleave = bind . mouseleave = createEventHandler ( element ) ;
578597 var counter = 0 ;
579598
599+ events . mouseenter = [ ] ;
600+ events . mouseleave = [ ] ;
580601
581602 bindFn ( element , 'mouseover' , function ( event ) {
582603 counter ++ ;
583604 if ( counter == 1 ) {
584- mouseenter ( event ) ;
605+ handle ( event , 'mouseenter' ) ;
585606 }
586607 } ) ;
587608 bindFn ( element , 'mouseout' , function ( event ) {
588609 counter -- ;
589610 if ( counter == 0 ) {
590- mouseleave ( event ) ;
611+ handle ( event , 'mouseleave' ) ;
591612 }
592613 } ) ;
593- eventHandler = bind [ type ] ;
594614 } else {
595- eventHandler = bind [ type ] = createEventHandler ( element ) ;
596- addEventListenerFn ( element , type , eventHandler ) ;
615+ addEventListenerFn ( element , type , handle ) ;
616+ events [ type ] = [ ] ;
597617 }
618+ eventFns = events [ type ]
598619 }
599- eventHandler . fns . push ( fn ) ;
620+ eventFns . push ( fn ) ;
600621 } ) ;
601622 } ,
602623
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 ,
621625
622626 replaceWith : function ( element , replaceNode ) {
623627 var index , parent = element . parentNode ;
0 commit comments