0

だから、私はこのスニペット<tr onclick="this.toggleClassName('selected')">をWebページで使用しています。(Prototype.js 関数) うまく機能します。テーブルの行をクリックするだけで、選択されたように見えます。IE と Opera を除いて、どこでも動作します。これは単なる便利なので、動作するかどうかはあまり気にしませんが、IE ではエラーがスローされ、ユーザーにデバッグするかどうか尋ねられます。

「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラー メッセージが表示されます。どのオブジェクトまたはどのメソッドを参照している可能性がありますか? IE でこの機能を実装する簡単な方法について何か考えはありますか? エラーメッセージをユーザーに投げ出さないのはどうですか?

ありがとう、デイブ

( http://math.davehampson.net )

4

3 に答える 3

4

ええ、これは基本的にプロトタイプの主な問題です。

プロトタイプは、ブラウザによって動作が異なります。ホスト オブジェクトのプロトタイプ (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.)

于 2009-12-04T01:43:46.153 に答える
1

代わりにこれを使用してみてください:

$(this).toggleClassName('selected')

詳細な理由: http://prototypejs.org/learn/extensions/

于 2009-12-04T01:24:35.043 に答える
0

「this」キーワードはjavascriptの基本であり、あなたの例ではtr domノードを返します。私は、prototypejs がメソッドを dom ノードにアタッチしていると思われますが、何らかの理由でこれが行われていないか、IE と Opera では機能していません。

于 2009-12-04T01:24:58.223 に答える