9

いくつかの「プライベート」データをDOM要素に関連付けようとしています。そのデータをDOM要素自体に追加するのではなく(DOM要素を変更しないようにしたい)、マップとして使用したい別のデータオブジェクトがあります。

それよりも:

document.GetElementById('someElementId').privateData = {};

私はやってみたいです

internalPrivateDataMap[document.GetElementById('someElementId')].privateData = {};

すべての要素にidフィールドがあるわけではなく、一部は動的に作成されるため、idをキーとして使用することはできません。

これはほとんどの要素で正常に機能しますが、「a」要素の場合、使用されているキーは要素のhrefであるように見えます。これは、DOMが要素のtoString()関数を定義しているためだと思います。

この結果、同じhrefを持つ2つの「a」要素がある場合、それらは私が望まないprivateDataを共有しています。

現在の回避策は、キーとして使用できる内部のuniqueIDを生成することですが、これを回避するためにDOM要素を変更する必要があります。

4

1 に答える 1

8

お気づきのとおり、これは確実に機能するわけではなく、すべての要素に(生成された)IDを与えるか、少なくとも新しいカスタム要素フィールドに一意のIDを割り当てることなく機能させる方法はわかりません。DOMノードには、マップのキーとして機能するために必要なプロパティがありません。

したがって、これらのソリューションが本当に残っています。

  • すでにIDがない場合は、各要素に生成されたIDを割り当てます
  • 新しいプライベートフィールドに一意のIDを割り当てます。これにより、DOMノードごとのメモリへの影響を小さく抑えながら、プライベートデータを別の場所に保持できます。DOM要素が削除されたときに、何らかの方法でプライベートデータをクリーンアップする必要があることを忘れないでください。
  • element.data()プライベートデータを読み取ってDOM要素に配置する必要があるjQueryのようなものを使用します
  • 独自element.privateData = {};の要素を使用する要素への参照を保持するイベントハンドラーのクリーンアップが必要であることに注意してください。そうしないと、予期しないメモリリークが発生します。
于 2012-11-08T16:30:13.247 に答える