Using jQuery's datastore vs. expando properties
Using $.data
will protect you from memory leaks.
In IE, when you assign a javascript object to an expando property on a DOM element, cycles that cross that link are not garbage collected. If your javascript object holds a reference to the dom object, the whole cycle will leak. It's entirely possible to end up with hidden references to DOM objects, due to closures, so you may leak without realizing it.
The jQuery datastore is set up to prevent these cycles from forming. If you use it, you will not leak memory in this way. Your example will not leak because you are putting primitives (strings) on the DOM element. But if you put a more complex object there, you risk leaking.
Use $.data
so you won't have to worry.
If you are authoring a plugin you should use $.data
. If you need to store the attribute often and rarely need to query the DOM for it then use $.data
.
Update 5 years later: jQuery does not query the DOM based on expando properties set, and hasn't done so for a while. So use $.data
. There's no reason to pollute the DOM when there is no pragmatic use to do so.
Using $.data
doesn't modify the DOM. You should use $.data
. If you're creating a plugin then you should store one object in $.data
with properties on that object as opposed to storing each of those properties as different key/value pairs in the $.data
structure.