Les versions plus récentes de la spécification DOMTokenList autorisent plusieurs arguments pour add()et remove(), ainsi qu'un deuxième argument toggle()pour forcer l'état.
Au moment de la rédaction de cet article, Chrome prend en charge plusieurs arguments pour add()et remove(), mais aucun des autres navigateurs ne le fait. IE 10 et inférieur, Firefox 23 et inférieur, Chrome 23 et inférieur et les autres navigateurs ne prennent pas en charge le deuxième argument de toggle().
J'ai écrit le petit polyfill suivant pour me guider jusqu'à ce que le support se développe:
(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;
};
}
})();
Un navigateur moderne conforme à ES5 DOMTokenListest attendu, mais j'utilise ce polyfill dans plusieurs environnements spécifiquement ciblés, donc cela fonctionne très bien pour moi, mais il faudra peut-être peaufiner les scripts qui fonctionneront dans les environnements de navigateur hérités tels que IE 8 et les versions antérieures .