Các phiên bản mới hơn của thông số DOMTokenList cho phép nhiều đối số add()
và remove()
, cũng như đối số thứ hai toggle()
để buộc trạng thái.
Tại thời điểm viết bài, Chrome hỗ trợ nhiều đối số add()
và remove()
, nhưng không có trình duyệt nào khác làm được. IE 10 trở xuống, Firefox 23 trở xuống, Chrome 23 trở xuống và các trình duyệt khác không hỗ trợ đối số thứ hai toggle()
.
Tôi đã viết các polyfill nhỏ sau đây để tiết lộ cho đến khi hỗ trợ mở rộng:
(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;
};
}
})();
Một trình duyệt hiện đại với tuân thủ ES5 và DOMTokenList
được mong đợi, nhưng tôi đang sử dụng polyfill này trong một số môi trường được nhắm mục tiêu cụ thể, vì vậy nó hoạt động rất tốt cho tôi, nhưng nó có thể cần điều chỉnh cho các tập lệnh sẽ chạy trong môi trường trình duyệt cũ như IE 8 trở xuống .