1。プロトタイプという言葉に感動した場合は、MDNDocs-継承とプロトタイプチェーンを確認することをお勧めします。
2。あなたが言及した最初のコードは、要素にクラスを追加する通常のクロスブラウザーの方法です。
関数宣言ではなく、要素のプロトタイプにメソッドとして追加されます。そのため、 (古き良きJavaScript)で要素をクエリするときに、要素自体でメソッドを呼び出すことができます。 id
3。投稿した2番目のコードは、新しいDOM仕様によるものです。W3リンク。これは、DOMレベル4仕様を実装しているブラウザーでのみ機能します。古いブラウザでは動作しません。
それが違いになります。
最良の方法については、ネイティブメソッドが常に最良かつ最速です。
したがって、をサポートするブラウザclasList
の場合、2番目が最適です。私の意見では、物事(ドラフト)が完成しなくなるまで、クロスブラウザーで動作し、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"), "");
}
};