2011-10-25 15 views
16

DOM要素にカスタムプロパティを設定しても問題ありませんか?Javascript DOM:カスタムDOM要素のプロパティを設定する

例えば、

<html><body><div id="foo"></div></body></html> 

与えられ、document.getElementById('foo').bar = "baz";を行うことが公正なのだろう、と等しい"baz"document.getElementsByTagName('div')[0].barを期待しますか?

ここで注意したいのは、通常のjavascriptオブジェクトのプロパティと同じで、要素の属性ではないということです。

私はそれがどのようにクロスブラウザーであるか、そしてそれがどんな仕様でもサポートされているかどうかに興味があります。

DOM APIは、毎回同じDOMエレメントに対して同じjavascriptオブジェクトが返されることを保証しますか?

+1

カスタムプロパティを設定できますが、カスタムプロパティは依存しません。それらは道路の標準的な特性となり、コードと衝突する可能性があります。 jquery/mootoolsが提供する要素ストレージシステム( '.data()'など)を使用する方がよいでしょう。 –

+1

* "DOM APIは毎回同じDOMエレメントに対して同じjavascriptオブジェクトが返されることを保証していますか?" * - 私はこの質問を理解していません。 DOM要素はホストオブジェクトであり、 "JavaScriptオブジェクト"(正式にはネイティブオブジェクトと呼ばれます)ではありません。 –

+0

そうですね。 http://jsfiddle.net/YJAvP/ – Birey

答えて

2

まあ、datasetプロパティがあります:

div.dataset.bar = 'baz'; 

が、それはIEに実装されていません。

ライブデモ:http://jsfiddle.net/simevidas/dJr2u/

+0

IEでシムできますか?シムに何か試みはありますか? – Raynos

+0

@Raynosわかりません。それは可能かもしれない... –

+0

私はこれは良い解決策だと思う、データセットが存在しない場合は単にそれをカスタムプロパティとして定義する。 – Ibu

1

さんは5年前、プロパティ.contains要素がいくつかの特別なデータが含まれているかどうか言って良いユースケースだと思ったとしましょう。

だからあなたは、あなたがNode.prototype.containsが方法であるため壊し今日if (document.getElementByID("someId").contains)

のようなチェックを持っていたdocument.getElementById("someId").contains = true

を書きました。

基本的にあなたのコードは将来安全ではありません。

+2

ポイントを獲得しました。私はそれが現在の安全であるかどうか(ブラウザがプログラマとの契約を破っているかどうかは、永続的なカスタムプロパティをサポートしていない場合)には不思議ではない。 – rampion

+0

@rampion私は個人的に壊れている実装を知りません – Raynos

+0

彼は 'elem 'を使うことができると思います。data_contains'または 'elem.dlkafh'はかなり安全です – oriadam

0

これは仕様が内部プロパティアクセサについて言うことです:

は特に指定しない限り、ホスト・オブジェクトは、どのような方法でこれらの内部メソッドを実装することができます。たとえば、特定のホストオブジェクトの[[Get]]と [[Put]]は実際にプロパティ の値をフェッチして格納しますが、[[HasProperty]]は常にfalseを生成します。

ホストオブジェクトは、[[入れ] 動作時に追加の制約を定義することができます。可能であれば、ホストオブジェクトは、この[[CanPut]]の定義が falseを返す状況で[[Put]] 操作を許可してはいけません。

しかし、これは単なる理論的なものだと思うし、実際にはexpandosは期待通りに機能すると思う。

5

一般的に、カスタムプロパティは使用しないでください。DOMオブジェクトは、想定どおりに動作しない可能性があるため、期待しない方法で変更しないでください。

HTML5のカスタム属性のメカニズムは、接頭辞data-を使用します。

しかし、HTML5はスタンダードではなく、まだ広く実装されていません。あなたはそれがすべて合理的に近代的なブラウザで動作するはずの属性データ -ためセット/のgetAttributeを使用している場合でも、標準的な属性はデータ -接頭辞で、将来的に導入すべきではありません。

しかし、私はまだ要素によってIDまたはクラスまたは(HTML 4.01のように)いくつかの他の標準的な属性値の値を格納するカスタムオブジェクトを使用することをお勧めし、それらを参照するだろう、と述べました。カスタムプロパティと属性の問題を回避し、どこでも動作することが知られています。

関連する問題