Новіші версії специфікації DOMTokenList дозволяють отримати безліч аргументів add()
і remove()
, а також другий аргумент toggle()
для примусового стану.
На момент написання, Chrome підтримує кілька аргументів , add()
і remove()
, але жоден з інших браузерів не роблять. IE 10 і новіші версії, Firefox 23 і новіші версії, Chrome 23 і нижчі та інші браузери не підтримують другий аргумент toggle()
.
Я написав наступний маленький поліфайл, щоб прислухати мене до тих пір, поки підтримка не розшириться:
(function () {
/*global DOMTokenList */
var dummy = document.createElement('div'),
dtp = DOMTokenList.prototype,
toggle = dtp.toggle,
add = dtp.add,
rem = dtp.remove;
dummy.classList.add('class1', 'class2');
// Older versions of the HTMLElement.classList spec didn't allow multiple
// arguments, easy to test for
if (!dummy.classList.contains('class2')) {
dtp.add = function () {
Array.prototype.forEach.call(arguments, add.bind(this));
};
dtp.remove = function () {
Array.prototype.forEach.call(arguments, rem.bind(this));
};
}
// Older versions of the spec didn't have a forcedState argument for
// `toggle` either, test by checking the return value after forcing
if (!dummy.classList.toggle('class1', true)) {
dtp.toggle = function (cls, forcedState) {
if (forcedState === undefined)
return toggle.call(this, cls);
(forcedState ? add : rem).call(this, cls);
return !!forcedState;
};
}
})();
Сучасний браузер із відповідністю ES5, і DOMTokenList
очікується, але я використовую цю полісистему в декількох конкретно орієнтованих середовищах, тому вона чудово працює для мене, але може знадобитися налаштування сценаріїв, які працюватимуть у застарілих середовищах браузера, таких як IE 8 і нижче .