2

I have a div structure like this:

<div class='bar'>
    <div class='contents'>
        <div class='element' data-big='join'>JOIN ME</div>
        <div class='element' data-big='play'>PLAY ME</div>
        <div class='element' data-big='list'>GO TO LIST</div>
        <div class='element' data-big='chart'>GO TO TOP 10</div>
    </div>
</div>

How can I refer to their data attribute by onClick function?

I tried with

$(".bar .element").on('click', ()=> {
    alert($(this).data('big'));
});

But it always alert "undefined".

EDIT:

My assertion was bad from the beginning, I was using a lambda (or arrow) expression from the Typescript language. That makes the different meaning of the keyword "this".

the snippet:

$(".bar .element").on('click', function(){
    alert($(this).data('big'));
});

works as espected.

11
  • .on('click', ()=> ??? What kind of syntax is it? Commented Nov 10, 2014 at 14:01
  • Can you confirm what version of jQuery? "As of jQuery 1.4.3 HTML 5 data- attributes will be automatically pulled in to jQuery's data object" Commented Nov 10, 2014 at 14:01
  • @Wolf .on('click', ()=> ??? What kind of syntax is it? This is a Typescript syntax equivalent to .on('click', funtion(){}); Commented Nov 10, 2014 at 14:04
  • 2
    @A.Wolff It's an ES6 construct Commented Nov 10, 2014 at 14:05
  • 1
    @A.Wolff It will be when enough browsers support it :) Commented Nov 10, 2014 at 14:09

5 Answers 5

3

You do not have a .barra (as you had in your original JS -- $(".barra .element")) element in your HTML and you've not written the callback properly:

$(".bar .element").on('click', function() {
    alert($(this).data('big'));
});

    $(".bar .element").on('click', function() {
        alert($(this).data('big'));
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='bar'>
    <div class='contents'>
        <div class='element' data-big='join'>JOIN ME</div>
        <div class='element' data-big='play'>PLAY ME</div>
        <div class='element' data-big='list'>GO TO LIST</div>
        <div class='element' data-big='chart'>GO TO TOP 10</div>
    </div>
</div>

Sign up to request clarification or add additional context in comments.

1 Comment

I know that my original snippet had a typo for the class selector but the problem wasn't there. I had a wrong syntax on my callback function, i was using a typescript lambda syntax instead of the usual javascript syntax. Anyway, I mark your as the right answer because you used JQuery "data" method.
3

you should change your function like below

$(".bar .element").on('click', function() {
    alert($(this).attr('data-big'));
});

Comments

3

In TypeScript, the arrow function expression (() =>) is used to preserve the lexical scope. This means that when you use this inside of an arrow function, it will refer to the same scope as using this outside of the function.

In your case, you want the function to run with the scope of the onclick event, not the lexical scope, so you should avoid using the arrow function and instead use function ().

Comments

1

Here is the working solution:

jQuery:

$(".bar .element").on('click', function() {
    alert($(this).attr('data-big'));
});

DEMO

Comments

0

you can use "id" to do it:

<div id='div1' class='element' data-big='join'>JOIN ME</div>

$("#div1").on('click', ()=> {
    alert($(this).data('big'));
});

1 Comment

I don't want to add ID on my element

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.