3
3
/* global JQLitePrototype: true,
4
4
addEventListenerFn: true,
5
5
removeEventListenerFn: true,
6
+ jqLiteAddClass: true,
7
+ jqLiteRemoveClass: true,
6
8
BOOLEAN_ATTR: true,
7
9
ALIASED_ATTR: true,
8
10
*/
@@ -357,7 +359,10 @@ function jqLiteHasClass(element, selector) {
357
359
indexOf ( " " + selector + " " ) > - 1 ) ;
358
360
}
359
361
360
- function jqLiteRemoveClass ( element , cssClasses ) {
362
+ var jqLiteAddClass = msie === 9 ? jqLiteAddClassIE9 : jqLiteAddClassCommon ;
363
+ var jqLiteRemoveClass = msie === 9 ? jqLiteRemoveClassIE9 : jqLiteRemoveClassCommon ;
364
+
365
+ function jqLiteRemoveClassCommon ( element , cssClasses ) {
361
366
if ( cssClasses && element . setAttribute ) {
362
367
forEach ( cssClasses . split ( ' ' ) , function ( cssClass ) {
363
368
element . setAttribute ( 'class' , trim (
@@ -369,7 +374,29 @@ function jqLiteRemoveClass(element, cssClasses) {
369
374
}
370
375
}
371
376
372
- function jqLiteAddClass ( element , cssClasses ) {
377
+ function jqLiteRemoveClassIE9 ( element , cssClasses ) {
378
+ if ( cssClasses && ( element . className || element . className === '' ) ) {
379
+ var existingClasses = ( ' ' + ( element . className . baseVal || element . className || '' ) + ' ' )
380
+ . replace ( / [ \r \n \s ] + / g, ' ' ) ;
381
+
382
+ forEach ( cssClasses . split ( ' ' ) , function ( cssClass ) {
383
+ cssClass = trim ( cssClass ) ;
384
+ existingClasses = existingClasses . replace ( ' ' + cssClass + ' ' , ' ' ) ;
385
+ } ) ;
386
+
387
+ existingClasses = trim ( existingClasses ) ;
388
+
389
+ if ( typeof element . className === 'string' ) {
390
+ /* assuming regular node */
391
+ element . className = existingClasses ;
392
+ } else {
393
+ /* assuming SVG */
394
+ element . className . baseVal = existingClasses ;
395
+ }
396
+ }
397
+ }
398
+
399
+ function jqLiteAddClassCommon ( element , cssClasses ) {
373
400
if ( cssClasses && element . setAttribute ) {
374
401
var existingClasses = ( ' ' + ( element . getAttribute ( 'class' ) || '' ) + ' ' )
375
402
. replace ( / [ \n \t ] / g, " " ) ;
@@ -385,6 +412,31 @@ function jqLiteAddClass(element, cssClasses) {
385
412
}
386
413
}
387
414
415
+ function jqLiteAddClassIE9 ( element , cssClasses ) {
416
+ // MSIE9 cannot reliably use setAttribute() when XML namespaces are used anywhere
417
+ // on the element. Because of this, we work with className directly.
418
+ if ( cssClasses && ( element . className || element . className === '' ) ) {
419
+ var existingClasses = ( ' ' + ( element . className . baseVal || element . className || '' ) + ' ' )
420
+ . replace ( / [ \r \n \s ] + / g, ' ' ) ;
421
+
422
+ forEach ( cssClasses . split ( ' ' ) , function ( cssClass ) {
423
+ cssClass = trim ( cssClass ) ;
424
+ if ( existingClasses . indexOf ( ' ' + cssClass + ' ' ) === - 1 ) {
425
+ existingClasses += cssClass + ' ' ;
426
+ }
427
+ } ) ;
428
+ existingClasses = trim ( existingClasses ) ;
429
+
430
+ if ( typeof element . className === 'string' ) {
431
+ /* assuming regular node */
432
+ element . className = existingClasses ;
433
+ } else {
434
+ /* assuming SVG */
435
+ element . className . baseVal = existingClasses ;
436
+ }
437
+ }
438
+ }
439
+
388
440
389
441
function jqLiteAddNodes ( root , elements ) {
390
442
// THIS CODE IS VERY HOT. Don't make changes without benchmarking.
0 commit comments