As versões mais recentes da especificação DOMTokenList permitem vários argumentos para add()e remove(), assim como um segundo argumento toggle()para forçar o estado.
No momento da redação deste artigo, o Chrome suporta vários argumentos para add()e remove(), mas nenhum dos outros navegadores suporta . IE 10 e inferior, Firefox 23 e inferior, Chrome 23 e inferior e outros navegadores não suportam o segundo argumento para toggle().
Escrevi o seguinte pequeno polyfill para me manter aquecido até que o suporte se expanda:
(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;
};
}
})();
Um navegador moderno com conformidade com o ES5 e DOMTokenListé esperado, mas eu estou usando esse polyfill em vários ambientes especificamente direcionados, por isso funciona muito bem para mim, mas pode precisar de ajustes para scripts que serão executados em ambientes de navegador herdados, como o IE 8 e versões inferiores. .