DOMElement#uniqueIDではまること

要素を区別するために固有のIDをつける必要がある。jQueryだと$.data(obj)という方法でやっている。やっていることはobj["jQuery" + (+new Date)]という値に連番を入れることなんだけど、これだと関数呼び出しのコストが半端無いことになる。

というわけで、$.dataをobj["uniqueID"]という値に連番を入れるような仕様に改めた。その場合、値を取得するとき、

var uid = obj.uniqueID || $.data(obj);

と書けます。これはIEでobjがDOMElementのとき、自動でIDを振ってくれるので便利です。便利ですが、実はobjがdocumentのとき、uidはアクセスごとに変わります。

javascript:alert(document.uniqueID);alert(document.uniqueID);

とか実行すればわかると思います。というわけで、documentのuniqueIDを取得し使うことが目的の場合、気をつけましょう。

kQueryでの場合

var uid = obj.uniqueID || $.data(obj);をやっているのはセレクター内ですが、動作上objにDOMElement以外が入ることはありえない(はずな)ので、やっています。イベントの関数登録ではdocument.uniqueIDが必要となりますが、$.data(obj)で呼び出したときはそういうことが起こらないような対応を行っているので大丈夫だと思います。