Las versiones más nuevas de la especificación DOMTokenList permiten múltiples argumentos para add()y remove(), así como un segundo argumento toggle()para forzar el estado.
Al momento de escribir, Chrome admite múltiples argumentos para add()y remove(), pero ninguno de los otros navegadores lo hace. IE 10 y versiones inferiores, Firefox 23 y versiones inferiores, Chrome 23 y versiones inferiores y otros navegadores no admiten el segundo argumento toggle().
Escribí el siguiente pequeño polyfill para ayudarme hasta que el soporte 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;
};
}
})();
Se DOMTokenListespera un navegador moderno con cumplimiento de ES5 , pero estoy usando este polyfill en varios entornos específicamente dirigidos, por lo que funciona muy bien para mí, pero podría necesitar ajustes para los scripts que se ejecutarán en entornos de navegador heredados como IE 8 y versiones anteriores .