Não é possível atualizar o valor do atributo de dados

88

Embora existam alguns exemplos sobre isso na web, não parece funcionar corretamente. Eu não consigo descobrir o problema.

Eu tenho este html simples

         <div id="foo" data-num="0"></ div>
         <a href="#" id="changeData">change data value</a>

Cada vez que clico no link "alterar valor dos dados", quero atualizar o valor dos dados de data-num. Por exemplo, preciso que seja 1,2,3,4, ... (mais 1 toda vez que clico no link)

o que eu tenho é

            var num = $('#foo').data("num");
            console.log(num);
            num = num+1;               
            console.log(num);
            $('#foo').attr('data-num', num);   

O valor muda uma vez de 0 para 1 todas as vezes. Não posso torná-lo incremental. Alguma sugestão do que estou fazendo de errado?

dev
fonte
5
data- é apenas um atributo no carregamento da página. Os dados são carregados no dom e manipulados usando .data(). O atributo não é atualizado e não deve ser usado para armazenar ou recuperar dados, apenas para definir dados inicialmente.
Nigel Angel
1
@NigelAngel errado. O objetivo do atributo de dados é fornecer um meio pelo qual os usuários podem armazenar (e modificar) dados arbitrários que não têm nenhum outro local válido para onde ir. E um exemplo disso seria para moeda estrangeira quando o ponto decimal é uma vírgula. Para cálculos numéricos com isso, você deve armazenar um valor adequado com um ponto decimal real em algum lugar. Se este for um preço total e precisar ser atualizado com base nas alterações, novamente esse valor de dados teria que ser alterado e, portanto, você precisa ser capaz de atualizá-lo. Para isso, você usaria o .attr ()
jezzipin

Respostas:

61

A RESPOSTA ABAIXO É BOA

Você não está usando o método de dados corretamente. O código correto para atualizar os dados é:

$('#foo').data('num', num); 

Então, seu exemplo seria:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Lucas willems
fonte
96
Isso está errado, esse é o método errado para atualizar um atributo
adeneo
2
Sim, concordo com você @adeneo mas ele não está usando o método de dados corretamente. Por que usar esse tipo de atributo se você deseja atualizá-lo com o método attr?
Lucas Willems
@dev editei minha resposta e adicionei todo o código que você precisa usar.
Lucas Willems
7
Isto é interessante. Posso ver que o valor muda no console. Mas quando eu olho para o html usando o Chrome, é 0 (inicial). Acho que está tudo bem se mais tarde eu puder recuperar o último valor (por exemplo 5)
dev
6
Como @dev disse, eu tentei e vi que isso mudou no jQuery, mas não afeta o html no Chrome e no Safari. Portanto, decido usar attr () em vez de data ().
QMaster
115

Em vez disso, use-o se desejar alterar o atributo data-num do elemento node, não do objeto de dados :

DEMO

$('#changeData').click(function (e) { 
    e.preventDefault();
    var num = +$('#foo').attr("data-num");
    console.log(num);
    num = num + 1;
    console.log(num);
    $('#foo').attr('data-num', num);
});

PS: mas você deve usar o objeto data () em praticamente todos os casos, mas não em todos ...

A. Wolff
fonte
7
Os dados são carregados no dom e manipulados usando .data (). O atributo não é atualizado e não deve ser usado para armazenar ou recuperar dados, apenas para definir dados inicialmente. Embora essa seja uma maneira de alterar um atributo ( .prop()é preferível), não é a maneira correta de usar os dados.
Nigel Angel
4
.prop()acessará ou alterará o valor de qualquer propriedade ou atributo no DOM, mas não no HTML. .attr()acessará e reescreverá HTML, o que o torna mais lento do que .prop(). Você não deve usar em .attr()vez de .data(), não apenas porque é mais lento, mas porque não é assim que deveria funcionar. jsfiddle.net/eXA76/2
Nigel Angel
1
Acho que essa resposta deve ser excluída porque dá um conselho ruim sobre o uso de dados ().
Nigel Angel
2
Sim, o jQuery documenta como deve ser usado! Os dados de api.jquery.com/data são armazenados em uma variável global no carregamento do documento. Referenciá-lo por meio do atributo NÃO FUNCIONARÁ se outro desenvolvedor, plugin ou script atualizar corretamente os dados usando .data(). Ao ignorar o método correto e usar o atributo, você está caminhando para causar problemas conscientemente.
Nigel Angel
4
@NigelAngel Embora aprecie sua opinião sobre isso, os dados nem sempre são a melhor opção a ser usada. E se você precisar atualizar o valor de um atributo de dados e exibi-lo no dom, além de realmente alterar o valor subjacente que é usado por CSS ou até mesmo Javascript? A melhor abordagem normalmente é usar .data () se você não estiver atualizando o valor de qualquer forma a partir de Javascript, mas se estiver, sempre use .attr () para definir e recuperar o valor.
jezzipin
30

Se quisermos recuperar ou atualizar esses atributos usando JavaScript nativo existente, podemos fazer isso usando os métodos getAttributee setAttributeconforme mostrado abaixo:

JavaScript

<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>

Por meio do jQuery

// Fetching data
var fruitCount = $(this).data('fruit');

// Above does not work in firefox. So use below to get attribute value.
var fruitCount = $(this).attr('data-fruit');

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

// But when you get the value again, it will return old value. 
// You have to set it as below to update value. Then you will get updated value.
$(this).attr('data-fruit','7'); 

Leia esta documentação para vanilla js ou esta documentação para jquery

Lalit Kumar Maurya
fonte
@Nigel Angel, você testou no firefox? $ (this) .data ('fruit') não funciona no firefox.
Lalit Kumar Maurya,
Muito obrigado pelo último conselho "Você tem que defini-lo como abaixo para atualizar o valor. Então você obterá o valor atualizado" rly comportamento estranho no jquery ..
jgr
12

Para mim, usando Jquery lib 2.1.1 o seguinte NÃO funcionou da maneira que eu esperava:

Defina o valor do atributo de dados do elemento:

$('.my-class').data('num', 'myValue');
console.log($('#myElem').data('num'));// as expected = 'myValue'

MAS o próprio elemento permanece sem o atributo:

<div class="my-class"></div>

Eu precisava do DOM atualizado para que eu pudesse fazer $ ('. My-class [data-num = "myValue"]') // o comprimento atual é 0

Então eu tive que fazer

$('.my-class').attr('data-num', 'myValue');

Para fazer com que o DOM seja atualizado:

<div class="my-class" data-num="myValue"></div>

Se o atributo existe ou não, $ .attr sobrescreverá.

Brian Ogden
fonte
1
Eu tenho o mesmo problema com jquery 2.1.1!
phlegx
8

Tive um problema semelhante e no final tive que definir ambos

obj.attr('data-myvar','myval')

e

obj.data('myvar','myval')

E depois disso

obj.data('myvar') == obj.attr('data-myvar')

Espero que isto ajude.

Krist0K
fonte
6

Basicamente, existem duas maneiras de definir / atualizar o valor do atributo de dados, dependendo da sua necessidade. A diferença é apenas onde os dados salvos,

Se você usá- .data()lo, ele será salvo na variável local chamada data_usere não .attr()ficará visível na inspeção do elemento. Se você usá- lo, ele ficará publicamente visível.

Explicação muito mais clara sobre este comentário

Sphro
fonte
2

Esta resposta é para aqueles que procuram apenas alterar o valor de um atributo de dados

O sugerido não mudará o valor de seu data-attr Jquery corretamente como @adeneo declarou. Por alguma razão, porém, não estou vendo ele (ou qualquer outra pessoa) postar o método correto para aqueles que buscam atualizar seus atributos de dados. A resposta que @Lucas Willems postou pode ser a resposta ao problema que Brian Tompsett - 汤 莱恩 está tendo, mas não é a resposta à pergunta que pode estar trazendo outros usuários aqui.

Resposta rápida em relação à declaração de inquérito original

-Para atualizar data-attr

$('#ElementId').attr('data-attributeTitle',newAttributeValue);

Erros fáceis * - deve haver "dados-" no início do atributo que você deseja alterar.

MattOlivos
fonte
2

Tive um problema semelhante, proponho esta solução embora não seja suportada no IE 10 e inferior.

Dado

<div id='example' data-example-update='1'></div>

O padrão Javascript define uma propriedade chamada dataset para atualizar data-example-update.

document.getElementById('example').dataset.exampleUpdate = 2;

Nota: use a notação camel case para acessar o atributo de dados correto.

Fonte: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes

Giovanni Romio
fonte
1

Eu tive o mesmo problema de tag de dados html não atualizando quando eu estava usando jquery, mas mudar o código que faz o trabalho real de jquery para javascript funcionou.

Tente usar isto quando o botão for clicado: (Observe que o código principal é a função Javascripts setAttribute () .)

function increment(q) {

    //increment current num by adding with 1
    q = q+1;

    //change data attribute using JS setAttribute function
    div.setAttribute('data-num',q);

    //refresh data-num value (get data-num value again using JS getAttribute function)
    num = parseInt(div.getAttribute('data-num'));

    //show values
    console.log("(After Increment) Current Num: "+num);

}

//get variables, set as global vars
var div = document.getElementById('foo');
var num = parseInt(div.getAttribute('data-num'));

//increment values using click
$("#changeData").on('click',function(){

    //pass current data-num as parameter
    increment(num);

});
Corte
fonte