1 . 如果你被原型这个词打动,你可能想查看MDN Docs-Inheritance 和原型链。
2 . 您提到的第一个代码是向元素添加类的正常跨浏览器方式。
它不是一个函数声明,而是作为一个方法添加到Element的原型中——这样当你通过它的id
(好的 ol' JavaScript )查询一个 Element 时,你可以简单地在元素本身上调用该方法。
3 . 您发布的第二个代码是根据新的 DOM 规范。W3 链接。它只适用于那些实现 DOM Level 4 Specs 的浏览器。它不适用于旧浏览器。
这就是区别。
对于最佳方法,本机方法始终是最好和最快的。
所以对于支持的浏览器,clasList
第二个应该是最好的。不过,根据我的观点,在事情(草案)尚未最终确定之前,您可能需要考虑一种可以跨浏览器工作并与 JavaScript (ECMA-3) 和受支持的 DOM 规范兼容的方法。
一个简单的想法应该是更改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"), "");
}
};