要素に情報を覚えさせるときに、jQueryのdataを使うべきか?Node::setUserData()を使うべきか?
参考
Core/data - jQuery JavaScript Library
http://docs.jquery.com/Core/data#namevalue
Node#setUserData、Node#getUserDataの使い方(jQuery.dataみたいなもの) - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20080903/1220447061
Node.setUserData - MDC
https://developer.mozilla.org/En/DOM/Node.setUserData
jQueryのdataの実装
していることは、要素にexpandoというjQueryの$が生きている間ユニークなIDで、属性を追加している。つまり$(".class_name")[0][expando] = "入れたい値"と同じ感じ。
ただし、DOMを触ると遅いブラウザがあるためか、キャッシュが利用される。
http://jqueryjs.googlecode.com/svn/trunk/jquery/src/data.js
jQuery.fn.extend({ data: function( key, value ){ var parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; // 一部省略 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ jQuery.data( this, key, value ); }); },
var expando = "jQuery" + now(), uuid = 0, windowData = {}; jQuery.extend({ cache: {}, data: function( elem, name, data ) { elem = elem == window ? windowData : elem; debugger; var id = elem[ expando ]; // Compute a unique ID for the element if ( !id ) id = elem[ expando ] = ++uuid; // Only generate the data cache if we're // trying to access or manipulate it if ( name && !jQuery.cache[ id ] ) jQuery.cache[ id ] = {}; // Prevent overriding the named cache with undefined values if ( data !== undefined ) jQuery.cache[ id ][ name ] = data; // Return the named cache data, or the ID for the element return name ? jQuery.cache[ id ][ name ] : id; },
比較
- モジュラリティ
- setUserData()
- JavaScriptがDOMノードに属性を追加してはいけないという点から、Node::setUserData()の方が望ましい。(ただし、setUserDataのキーにモジュールの名称を追加しない場合、jQueryのdataを使った方がまし。)
- setUserData()
* write dirty: 125 data: 285 setUserData: 129 * read dirty: 263 data: 427 getUserData: 254
結論
多くの場面で速度は気にならないので、とりあえずjQueryのdataを使おう。
要素に直接属性を追加する点に関しては、そのうちdataの実装がsetUserData()を使うようになるだろう。