JavaScript. Подробное руководство, 6-е издание, стр. 244
Подобно другим классам коллекций в модели DOM, объект
<b>DOMTokenList</b><b>classList</b><b>DOMTokenList</b><b>classList</b><b>className</b><b>DOMTokenList</b><b>DOMTokenList</b><b>className</b>На момент написания этих строк свойство
<b>classList</b><b>class</b>Пример 16.5. : интерпретирует <b>classList()</b>, как множество CSS-классов<b>className</b>
<b>//</b><b>* Возвращает свойство classList элемента е. если оно содержит один класс.</b><b>* Иначе возвращает объект, имитирующий интерфейс DOMTokenList.</b><b>* Возвращаемый объект имеет методы contains(), add(), remove(), toggle() и toString(),</b><b>* позволяющие проверять и изменять набор классов элемента е. Если свойство classList</b><b>* имеет встроенную поддержку в броузере, функция возвращает объект, подобный массиву,</b><b>* который имеет свойство length и поддерживает возможность индексирования массива.</b><b>* Имитация объекта DOMTokenList не подобна массиву, но имеет метод toArray().</b><b>* который возвращает истинный массив имен классов элемента.</b><b>*/</b><b>function classList(e) {</b><b> if (е.classList) return e.classList; // Вернуть e.classList, если имеется</b><b> else return new CSSClassList(e); // Иначе попытаться подделать его</b><b>}</b><b>// CSSClassList - класс JavaScript, имитирующий объект DOMTokenList </b><b>function CSSClassList(e) { this.e = e; }</b><b>// Возвращает true, если e.className содержит класс с, иначе - false </b><b>CSSClassList.prototype.contains = function(c) {</b><b> // Проверить, является ли с допустимым именем класса </b><b> if (с.length === 0 || c.indexOf(" ") != -1)</b><b> throw new Error("Недопустимое имя класса: + с + .....);</b><b> // Сначала проверить общие случаи</b><b> var classes = this.e.className;</b><b> if (!classes) return false; // e вообще не имеет классов</b><b> if (classes === c) return true; // e имеет единственный класс,</b><b> // имя которого точно совпадает с искомым</b><b> // Иначе использовать RegExp для поиска с как отдельного слова </b><b> // \b - в регулярных выражениях соответствует границе слова,</b><b> return classes.search(”\\b" + с + "\\b") != -1;</b><b>};</b><b>// Добавляет имя класса с в е.className, если оно отсутствует в списке </b><b>CSSClassList.prototype.add = function(c) {</b><b> if (this.contains(c)) return; // Ничего не делать, если имя уже в списке</b><b> var classes = this.e.className;</b><b> if (classes && classes[classes.length-1] != " ")</b><b> c = " " + с; // Добавить пробел, если необходим</b><b> this.е.className += с; // Добавить имя с в className</b><b>};</b><b>// Удаляет все вхождения с из е.className </b><b>CSSClassList.prototype.remove = function(c) {</b><b> // Убедиться, что с - допустимое имя класса </b><b> if (с.length === 0 || c.indexOf(" ") != -1)</b><b> throw new Error("Недопустимое имя класса: + с + .....);</b><b> // Удалить все вхождения имени с как слова и все завершающие пробелы</b><b> var pattern = new RegExp("\\b" + с + '\\b\\s*'\ "g");</b><b> this.e.className = this.e.className.replace(pattern, "");</b><b>};</b><b>// Добавляет имя с в e.className, если оно отсутствует в списке, и возвращает true.</b><b>// Иначе удаляет все вхождения имени с из e.className и возвращает false.</b>