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