@@ -98,6 +98,46 @@ function camelCase(name) {
98
98
} ) ;
99
99
}
100
100
101
+ /////////////////////////////////////////////
102
+ // jQuery mutation patch
103
+ /////////////////////////////////////////////
104
+
105
+ function JQLitePatchJQueryRemove ( name , dispatchThis ) {
106
+ var originalJqFn = jQuery . fn [ name ] ;
107
+ originalJqFn = originalJqFn . $original || originalJqFn ;
108
+ removePatch . $original = originalJqFn ;
109
+ jQuery . fn [ name ] = removePatch ;
110
+
111
+ function removePatch ( ) {
112
+ var list = [ this ] ,
113
+ fireEvent = dispatchThis ,
114
+ set , setIndex , setLength ,
115
+ element , childIndex , childLength , children ,
116
+ fns , data ;
117
+
118
+ while ( list . length ) {
119
+ set = list . shift ( ) ;
120
+ for ( setIndex = 0 , setLength = set . length ; setIndex < setLength ; setIndex ++ ) {
121
+ element = jqLite ( set [ setIndex ] ) ;
122
+ if ( fireEvent ) {
123
+ data = element . data ( 'events' ) ;
124
+ if ( ( fns = data && data . $destroy ) ) {
125
+ forEach ( fns , function ( fn ) {
126
+ fn . handler ( ) ;
127
+ } ) ;
128
+ }
129
+ } else {
130
+ fireEvent = ! fireEvent ;
131
+ }
132
+ for ( childIndex = 0 , childLength = ( children = element . children ( ) ) . length ; childIndex < childLength ; childIndex ++ ) {
133
+ list . push ( jQuery ( children [ childIndex ] ) ) ;
134
+ }
135
+ }
136
+ }
137
+ return originalJqFn . apply ( this , arguments ) ;
138
+ }
139
+ }
140
+
101
141
/////////////////////////////////////////////
102
142
function jqLiteWrap ( element ) {
103
143
if ( isString ( element ) && element . charAt ( 0 ) != '<' ) {
@@ -137,9 +177,15 @@ function JQLiteRemoveData(element) {
137
177
var cacheId = element [ jqName ] ,
138
178
cache = jqCache [ cacheId ] ;
139
179
if ( cache ) {
140
- forEach ( cache . bind || { } , function ( fn , type ) {
141
- removeEventListenerFn ( element , type , fn ) ;
142
- } ) ;
180
+ if ( cache . bind ) {
181
+ forEach ( cache . bind , function ( fn , type ) {
182
+ if ( type == '$destroy' ) {
183
+ fn ( { } ) ;
184
+ } else {
185
+ removeEventListenerFn ( element , type , fn ) ;
186
+ }
187
+ } ) ;
188
+ }
143
189
delete jqCache [ cacheId ] ;
144
190
element [ jqName ] = undefined ; // ie does not allow deletion of attributes on elements.
145
191
}
@@ -241,13 +287,16 @@ var SPECIAL_ATTR = makeMap("multiple,selected,checked,disabled,readonly,required
241
287
242
288
forEach ( {
243
289
data : JQLiteData ,
290
+ inheritedData : function ( element , name , value ) {
291
+ element = jqLite ( element ) ;
292
+ while ( element . length ) {
293
+ if ( value = element . data ( name ) ) return value ;
294
+ element = element . parent ( ) ;
295
+ }
296
+ } ,
244
297
245
298
scope : function ( element ) {
246
- var scope ;
247
- while ( element && ! ( scope = jqLite ( element ) . data ( $$scope ) ) ) {
248
- element = element . parentNode ;
249
- }
250
- return scope ;
299
+ return jqLite ( element ) . inheritedData ( $$scope ) ;
251
300
} ,
252
301
253
302
removeAttr : function ( element , name ) {
0 commit comments