JavaScriptオブジェクトをHTML要素に添付する良い方法はありますか?


96

JavaScriptオブジェクトをHTML要素に関連付けたいのですが。これを行う簡単な方法はありますか?

HTML DOMがsetAttributeメソッドを定義していることに気づき、これは任意の属性名に対して定義されているように見えます。ただし、これは文字列値のみを設定できます。(もちろん、これを使用してキーを辞書に格納できます。)

詳細(私は主に一般的な質問に興味があります):

具体的には、ツリー内のノードを表すHTML要素があり、ドラッグアンドドロップを有効にしようとしていますが、jQueryドロップイベントでは、ドラッグアンドドロップされる要素しか表示されません。

イベントハンドラーに情報を取得するための通常のパターンは、JavaScriptオブジェクトの作成と同時にHTML要素を作成し、これらのJavaScriptオブジェクトを閉じることによってイベントハンドラーを定義することですが、これではうまくいきません。ケース(ドラッグの開始時に入力されるグローバルオブジェクトを使用できますが、これは少し厄介に感じられます)。

回答:


44

jQuery data()メソッドを見たことはありますか?必要に応じて要素に複雑なオブジェクトを割り当てることも、そのメソッドを利用して少なくともオブジェクト(または他のデータ)への参照を保持することもできます。


8
ありがとう:これは私が探していたものとほぼ同じです。興味深いことに、このメソッドを定義するために、jqueryは各要素の文字列属性のグローバルディクショナリにキーを格納します。この文字列属性の名前は、jqueryが最初に読み込まれたときにランダムに生成されます。(これを行うための良い方法がないことを
示唆する

6
jQuery はbobince回答を使用してdata() 動作する ため、jqueryをまだ使用していない場合、それを使用することもできます。
Eamon Nerbonne 2014年

6
6年後、この答えを振り返って、「これは非常に最適な答えではありません。@ bobinceが受け入れるべき答えを持っているはずです」と考えると面白いでしょう。
Phil.Wheeler 2015年

6
この質問にはjQueryタグがありません。
のMichałPerłakowski

111

JavaScriptオブジェクトには、任意のプロパティを割り当てることができます。許可するために特別なことを行う必要はありません。これにはDOM要素が含まれます。この動作はDOM標準の一部ではありませんが、JavaScriptの最初のバージョンに戻った場合に当てはまり、完全に信頼できます。

var div= document.getElementById('nav');
div.potato= ['lemons', 3];

5
@ tat.wright-彼が話しているHTML要素の任意のプロパティはExpandoプロパティと呼ばれます。また、そのdiv.potatoが平均div.getAttribute(「ポテト」)していません
nickytonline

36
@ティムダウン:それからそれをしないでください。なぜそれが信頼できないのかはわかりません。これは、Stringオブジェクトをnullに設定できるため、信頼できないと言っているようなものです。
サイモン

5
@TimDown:しかし、document.expando = falseブレークjQuery.dataも設定しませんか?
ジョーイアダムス

8
私の経験から、これが良くない理由はメモリリークの可能性です。これを回避する簡単な方法があるかもしれませんが、これを多用するデザインを作成したとき、多くのメモリリークがありました。要素がページから削除された場合、参照のカウントは処理されない(クリーンアップされない)ので、おそらくその逆も同様なので、特に注意する必要があると思います。
eselk 2013年

7
公正な警告:私は答えが説明することを喜んで行っていましたが、フィールド名「ポテト」の代わりに「スコープ」を使用していました。「スコープ」はテーブルセル要素(<td>)の属性であり、このフィールドに割り当てたオブジェクトは#toStringされていることがわかります。私はtd.scope === '[object Object]'を見て非常に混乱しました。
David Groomes 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.