Como obter o atributo de identificação de dados?

813

Estou usando o plug-in de areia movediça jQuery. Preciso obter o ID de dados do item clicado e passá-lo para um serviço da web. Como obtenho o atributo de identificação de dados? Estou usando o .on()método para reativar o evento click para itens classificados.

$("#list li").on('click', function() {
  //  ret = DetailsView.GetProject($(this).attr("#data-id"), OnComplete, OnTimeOut, OnError);
  alert($(this).attr("#data-id"));
});
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>

<ul id="list" class="grid">
  <li data-id="id-40" class="win">
    <a id="ctl00_cphBody_ListView1_ctrl0_SelectButton" class="project" href="#">
      <img src="themes/clean/images/win.jpg" class="project-image" alt="get data-id" />
    </a>
  </li>
</ul>

Bruce Adams
fonte
57
Aviso aos novos visitantes: método .Live de JQuery () foi preterido em favor de .no ()
dendini
3
Você deve remover o # do alerta, você não precisa dele :-)
Becs Carter
attr ("# data-id")) está errado. corrigido: attr ("data-id"));
guido _nhcol.com.br_
@BruceAdams, pode valer a pena editar a pergunta para usar o on()método como live()agora está obsoleto, e essa pergunta recebe muitos visitantes.
Rory McCrossan

Respostas:

1637

Para obter o conteúdo do atributo data-id(como em <a data-id="123">link</a>), você deve usar

$(this).attr("data-id") // will return the string "123"

ou .data()(se você usar o jQuery mais recente> = 1.4.3)

$(this).data("id") // will return the number 123

e a parte depois data-deve estar em minúscula, por exemplo data-idNum, não funcionará, mas data-idnumfuncionará.

Marcel Jackwerth
fonte
7
Eu tive que usar attr()porque o jQuery estava removendo zeros à esquerda dos códigos postais data(), o TFM diz "A partir do jQuery 1.4.3, os atributos de dados HTML 5 serão automaticamente puxados para o objeto de dados do jQuery ... Todas as tentativas são feitas para converter a string para um valor JavaScript (isso inclui booleanos, números, objetos, matrizes e nulos). Um valor só é convertido em um número se isso não alterar a representação do valor. Por exemplo, "1E02" e "100.000" são equivalentes como números (valor numérico 100), mas convertê-los alteraria sua representação para que sejam deixados como seqüências de caracteres. "
Wesley Murch
43
Isso está retornando 'indefinido' para mim.
Foreever
4
Embora óbvio para alguns, acho que vale a pena notar para aqueles que tiveram problemas com isso que, ao usar .attr (), o texto entre colchetes deve corresponder ao que você definiu como seu atributo de dados personalizado. ou seja, se o atributo de dados customizados é volume de dados , você deve referenciá-lo usando .attr ("volume de dados") . E, com o jQuery 1.4.3 para cima e usando .data (), o texto entre colchetes deve corresponder ao seu atributo de dados personalizado sem o prefixo de dados . ou seja, se o atributo de dados customizados é volume de dados , você deve referenciá-lo usando .data ("volume") .
Luke
111
Para quem denuncia que não funciona, verifique se o atributo contém apenas letras minúsculas. Por exemplo, "data-listId" deve ser "data-listid". Consulte stackoverflow.com/questions/10992984/… para saber o motivo.
WindChimes 23/11
2
ou$(this).data().id //returns 123
Dem Pilafian 31/01
170

Se quisermos recuperar ou atualizar esses atributos usando o JavaScript nativo existente, podemos fazê-lo usando os métodos getAttribute e setAttribute, como mostrado abaixo:

Através do JavaScript

<div id='strawberry-plant' data-fruit='12'></div>

<script>
// 'Getting' data-attributes using getAttribute
var plant = document.getElementById('strawberry-plant');
var fruitCount = plant.getAttribute('data-fruit'); // fruitCount = '12'

// 'Setting' data-attributes using setAttribute
plant.setAttribute('data-fruit','7'); // Pesky birds
</script>

Através do jQuery

// Fetching data
var fruitCount = $(this).data('fruit');
OR 
// If you updated the value, you will need to use below code to fetch new value 
// otherwise above gives the old value which is intially set.
// And also above does not work in ***Firefox***, so use below code to fetch value
var fruitCount = $(this).attr('data-fruit');

// Assigning data
$(this).attr('data-fruit','7');

Leia esta documentação

Lalit Kumar Maurya
fonte
90

Nota importante. Lembre-se de que, se você ajustar o data- atributo dinamicamente via JavaScript, NÃO será refletido na data()função jQuery. Você também deve ajustá-lo via data()função.

<a data-id="123">link</a>

js:

$(this).data("id") // returns 123
$(this).attr("data-id", "321"); //change the attribute
$(this).data("id") // STILL returns 123!!!
$(this).data("id", "321")
$(this).data("id") // NOW we have 321
Serge Shultz
fonte
Bom ponto ... existe uma atualização de dados () para atualizar os dados dos atributos?
Harag 03/07/19
1
É um ponto importante para alterar e acessar o valor do atributo de dados dinamicamente.
Motahar Hossain
56

Se você não está preocupado com navegadores IE antigos, também pode usar a API do conjunto de dados HTML5

HTML

<div id="my-div" data-info="some info here" data-other-info="more info here">My Awesome Div</div>

JS

var myDiv = document.querySelector('#my-div');

myDiv.dataset.info // "some info here"
myDiv.dataset.otherInfo // "more info here"

Demonstração: http://html5demos.com/dataset

Lista completa de suporte do navegador: http://caniuse.com/#feat=dataset

Roni
fonte
19

Surpreendido, ninguém mencionou:

<select id="selectVehicle">
     <option value="1" data-year="2011">Mazda</option>
     <option value="2" data-year="2015">Honda</option>
     <option value="3" data-year="2008">Mercedes</option>
     <option value="4" data-year="2005">Toyota</option>
    </select>

$("#selectVehicle").change(function () {
     alert($(this).find(':selected').data("year"));
});

Aqui está o exemplo de trabalho: https://jsfiddle.net/ed5axgvk/1/

curiousBoy
fonte
2
Resposta muito agradável. Muito obrigado.
Ruberandinda Patience
13

HTML

<span id="spanTest" data-value="50">test</span>

JS

$(this).data().value;

ou

$("span#spanTest").data().value;

ANS: 50

Funciona para mim!

bamossza
fonte
11
var id = $(this).dataset.id

funciona para mim!

ofir_aghai
fonte
11

Acessar atributos de dados por si só idé um pouco fácil para mim.

$("#Id").data("attribute");

function myFunction(){
  alert($("#button1").data("sample-id"));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button type="button" id="button1" data-sample-id="gotcha!" onclick="myFunction()"> Clickhere </button>

Aravindh Gopi
fonte
7

Este trecho de código retornará o valor dos atributos dos dados, por exemplo: id-data, data-hora, nome-dados etc., mostrei a id

<a href="#" id="click-demo" data-id="a1">Click</a>

js:

$(this).data("id");

// obtém o valor do ID de dados -> a1

$(this).data("id", "a2");

// isso mudará o ID de dados -> a2

$(this).data("id");

// obtém o valor do ID de dados -> a2

Ashokkumar C
fonte
4

usando jQuery:

  $( ".myClass" ).load(function() {
    var myId = $(this).data("id");
    $('.myClass').attr('id', myId);
  });
Ignacio Galdames
fonte
0

Eu tenho um palmo. Eu quero pegar o valor do atributo data-txt-lang, que é usado definido.

$(document).ready(function ()
{
<span class="txt-lang-btn" data-txt-lang="en">EN</span>
alert($('.txt-lang-btn').attr('data-txt-lang'));
});
Pergin Sheni
fonte
0

O problema é que você não está especificando a opção ou a opção selecionada de lista suspensa ou lista. Aqui está um exemplo de lista suspensa, estou assumindo um registro de dados de atributo de dados.

$('#select').on('change', function(){
        let element = $("#visiabletoID");
        element.val($(this).find(':selected').data('record'));
    });
Haleem Khan
fonte