Ответ 1
1. Если вы перемещены с помощью слова прототипа, вы можете проверить MDN Docs - Наследование и цепочка прототипов.
2. Первый код, который вы упомянули, является обычным кросс-браузерным способом добавления класса в элемент.
Вместо того, чтобы быть объявлением функции, он добавлен как метод к прототипу Элемент, так что, когда вы запрашиваете элемент через его id
(хороший ol JavaScript) вы можете просто вызвать метод на самом элементе.
3. Второй код, который вы опубликовали, соответствует новой спецификации DOM. W3 Link. Он будет работать только в тех браузерах, которые реализуют DOM Level 4 Specs. Он не будет работать в старых браузерах.
Это имеет значение.
Для лучшего метода собственный метод всегда является лучшим и быстрым.
Итак, для браузеров, поддерживающих clasList
, второй должен быть лучшим. Однако, по моему мнению, до тех пор, пока события (черновики) не будут завершены, вы можете рассмотреть метод, который работает кросс-браузер и совместим как с JavaScript (ECMA-3), так и с поддержкой DOM Spec.
Простейшей идеей должно быть изменение свойства className
, доступного во всех новых и старых браузерах, и добавление к нему class
в виде строки:
var el = document.getElementById(id);
el.className = el.className + " " + cls;
// mind the space while concatening
Конечно, вы можете добавить методы проверки, такие как использование regex
для обрезки пробелов при добавлении и удалении.
Кстати, я получил полную часть кода, который вы отправили в качестве первого примера:
Element.prototype.hasClassName = function(name) {
return new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)").test(this.className);
};
Element.prototype.addClassName = function(name) {
if (!this.hasClassName(name)) {
this.className = this.className ? [this.className, name].join(' ') : name;
}
};
Element.prototype.removeClassName = function(name) {
if (this.hasClassName(name)) {
var c = this.className;
this.className = c.replace(new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)", "g"), "");
}
};