Более новые версии спецификации DOMTokenList допускают множественные аргументы для add()
и remove()
, а также второй аргумент toggle()
для принудительного вызова состояния.
На момент написания Chrome поддерживает несколько аргументов add()
и remove()
, но ни один из других браузеров не поддерживает . IE 10 и ниже, Firefox 23 и ниже, Chrome 23 и ниже и другие браузеры не поддерживают второй аргумент toggle()
.
Я написал следующий небольшой polyfill, чтобы прикрыть меня, пока поддержка не расширится:
(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 и ниже ,