I ran into a similar “bug” a few days ago when working with .data()
and .attr('data-name')
for HTML5 data attributes.
The behavior you’re describing is not a bug, but is by design.
The .data()
call is special – not only does it retrieve HTML5 data attributes it also attempts to evaluate/parse the attributes. So with an attribute like data-myjson='{"hello":"world"}'
when retrieved via .data()
will return an Object
while retrieval via .attr()
will return a string. See jsfiddle example.
Since .data()
does extra processing jQuery stores the results of attribute evaluation in $.cache
– after all, once a data attribute has been evaluated it would be wasteful to re-evaluate on every .data()
call – especially since data variables can contain complex JSON strings.
I said all that to say the following: After retrieving an attribute via .data()
any changes made by .attr('data-myvar', '')
will not be seen by subsequent .data()
calls. Test this out on jsfiddle.
To avoid this problem don’t intermix .data
and .attr()
calls. Use one or the other.