From 5496ce7031af5de104687027f1abaebf11f10c43 Mon Sep 17 00:00:00 2001 From: Casey Holzer Date: Tue, 11 Dec 2018 12:04:55 -0700 Subject: [PATCH] add classList support for IE 8 & 9. #2151 --- js/bootstrap-select.js | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/js/bootstrap-select.js b/js/bootstrap-select.js index edb80723b..054f13618 100644 --- a/js/bootstrap-select.js +++ b/js/bootstrap-select.js @@ -1,6 +1,57 @@ (function ($) { 'use strict'; + // Polyfill for browsers with no classList support + // Remove in v2 + if (!('classList' in document.createElement('_'))) { + (function (view) { + if (!('Element' in view)) return; + + var classListProp = 'classList', + protoProp = 'prototype', + elemCtrProto = view.Element[protoProp], + objCtr = Object, + classListGetter = function () { + var $elem = $(this); + + return { + add: function (classes) { + return $elem.addClass(classes); + }, + remove: function (classes) { + return $elem.removeClass(classes); + }, + toggle: function (classes, force) { + return $elem.toggleClass(classes, force); + }, + contains: function (classes) { + return $elem.hasClass(classes); + } + } + }; + + if (objCtr.defineProperty) { + var classListPropDesc = { + get: classListGetter, + enumerable: true, + configurable: true + }; + try { + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } catch (ex) { // IE 8 doesn't support enumerable:true + // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36 + // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected + if (ex.number === undefined || ex.number === -0x7FF5EC54) { + classListPropDesc.enumerable = false; + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } + } + } else if (objCtr[protoProp].__defineGetter__) { + elemCtrProto.__defineGetter__(classListProp, classListGetter); + } + }(window)); + } + var testElement = document.createElement('_'); testElement.classList.toggle('c3', false); @@ -19,6 +70,8 @@ }; } + testElement = null; + // shallow array comparison function isEqual (array1, array2) { return array1.length === array2.length && array1.every(function (element, index) {