60

I have the following code:

alert($embellishment.data("embellishmentId"));
alert($embellishment.attr("data-embellishmentId"));

The first alert returns undefined, whereas the second alert returns an integer, 3.

-- SEE DEMO --

I'm using jQuery version 1.7.2 (data was added with version 1.4 I believe)

Why is this? Should I be using data() at all if its not returning the right values?

0

1 Answer 1

124

OK. I found the problem by interpreting jQuery docs.

When you write:

$embellishment.data("embellishmentId");

it is handled by jQuery as compound attribute:

<div data-embellishment-id="3"></div>

So, to solve the problem you can use lower case in the data key otherwise it just addresses the different attribute.

<!-- HTML -->
<div data-embellishmentid="3"></div>

// JavaScript
$embellishment.data("embellishmentid");
Sign up to request clarification or add additional context in comments.

5 Comments

Here is the source code that does it: var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); in internal function dataAttr. Where rmultidash is rmultiDash = /([A-Z])/g;
Guys, jQuery has done that for a long time. Take a look at CSS attributes. If you want to see a CSS style, it uses camelCase for un-quoted attributes. For example: $('#elem').css({paddingTop: '40px'}); and $('#elem').css({'padding-top': '40px'});.
@Vision, If we use multiple data how it's works? eg <div data-embellishmentid="4"></div>, <div data-embellishmentid="5"></div>, <div data-embellishmentid="6"></div>
@samsam Not sure what you ask for, but assume you want an array of values. Use this approach: $embellishment.map(function() { return $(this).data('embellishmentid'); }).get();.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.