ええ、これは基本的にプロトタイプの主な問題です。
プロトタイプは、ブラウザによって動作が異なります。ホスト オブジェクトのプロトタイプ (HTMLTableRowElement など) を操作できるブラウザでは、それらのプロトタイプに似た独自の関数が追加さtoggleClassName
れるため、 を取得するたびに<tr>
そのメソッドを直接呼び出すことができます。うふふ、なんて便利!
残念ながら、DOM ノードのプロトタイプを変更できることは、ECMAScript または DOM 標準が実際に推奨しているものではありません。Mozilla はそのように優れているため、たまたま Firefox で動作しますが、すべてのブラウザーで動作するとは期待できません。確かに IE では動作しません。
したがって、他のブラウザーでは、処理するすべてのオブジェクトに独自のメソッドを追加 (「拡張」) するように Prototype に指示する必要があります。
Element.extend(this);
this.toggleClassName
これで、すべてのブラウザで安全に呼び出すことができます。
その特定<tr>
の を拡張すると、今後それにアクセスするたびに拡張されたままになるため、引き続き呼び出すことができますtoggleClassName
。さらに、Prototype メソッド (など) を介して要素にアクセスする$('mytrid')
と、自動的に要素が拡張されます。
これは便利な機能ではありません。これは罠です。これは、(プロトタイプ ハッキングをサポートする) ブラウザーでたまたま動作するが、他の場所では失敗するコードを作成することをお勧めします。ページ要素を特定の順序で操作するとたまたま機能するコードを作成することをお勧めします。これにより、拡張されたメソッドが呼び出される前にすべての要素が拡張され、別の順序で要素を操作するとフォールオーバーすることが保証されます。
これはデバッグの惨事であり、プロトタイプを使用しない理由です。
(来週は、さらに火遊びを楽しむために、Why I Do Not Use jQuery Both.)