Accessing data attribute using jquery returns undefined?

后端 未结 2 1074
傲寒
傲寒 2021-02-05 18:55

Inside my view i have a button as follow:

相关标签:
2条回答
  • 2021-02-05 19:27

    When reading data attributes using data() you need to remove the - and camel case the value. So you want:

    var id = $(this).data('assignedId');
    

    the docs on data() show this:

    As of jQuery 1.4.3 HTML 5 data- attributes will be automatically pulled in to jQuery's data object. The treatment of attributes with embedded dashes was changed in jQuery 1.6 to conform to the W3C HTML5 specification.

    For example, given the following HTML:

    <div data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'></div>
    

    All of the following jQuery code will work.

    $( "div" ).data( "role" ) === "page";
    $( "div" ).data( "lastValue" ) === 43;
    $( "div" ).data( "hidden" ) === true;
    $( "div" ).data( "options" ).name === "John";
    

    The second statement of the code above correctly refers to the data-last-value attribute of the element. In case no data is stored with the passed key, jQuery searches among the attributes of the element, converting a camel-cased string into a dashed string and then prepending data- to the result. So, the string lastValue is converted to data-last-value.


    I didn't notice how your binding the click event. If you want to use $(this) you have to bind the event using jquery. So you need:

    <button data-assigned-id="works" id="button">
    clickme</button>
    
    $(window).ready(function() {
         //bind the event using jquery not the onclick attribute of the button
         $('#button').on('click', updateClick);
    
    });
    
    
    function updateClick() {
        alert($(this).data('assignedId'));
    }
    

    Working fiddle

    0 讨论(0)
  • 2021-02-05 19:29

    In your current script, $(this) refers to the Window object (not your button) which does not have a data- attribute so its undefined.

    You could solve this by passing the element to the function

    <button data-assigned-id="@IdUser" onclick="updateClick(this)" type="button" ... ></button>
    
    function updateClick(element) {
        var id = $(element).data('assigned-id');
        ....
    

    However a better approach is to use Unobtrusive Javascript rather than polluting your markup with behavior.

    <button data-assigned-id="@IdUser" id="mybutton" type="button" class="btn btn-sm btn-default"></button>
    
    $('#mybutton').click(function() {
        var id = $(this).data('assigned-id'); // $(this) refers to the button
        ....
    });
    
    0 讨论(0)
提交回复
热议问题