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?
.data()
. O atributo não é atualizado e não deve ser usado para armazenar ou recuperar dados, apenas para definir dados inicialmente.Respostas:
A RESPOSTA ABAIXO É BOA
Você não está usando o método de dados corretamente. O código correto para atualizar os dados é:
Então, seu exemplo seria:
fonte
Em vez disso, use-o se desejar alterar o atributo data-num do elemento node, não do objeto de dados :
DEMO
PS: mas você deve usar o objeto data () em praticamente todos os casos, mas não em todos ...
fonte
.prop()
é preferível), não é a maneira correta de usar os dados..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.data()
. Ao ignorar o método correto e usar o atributo, você está caminhando para causar problemas conscientemente.Se quisermos recuperar ou atualizar esses atributos usando JavaScript nativo existente, podemos fazer isso usando os métodos
getAttribute
esetAttribute
conforme mostrado abaixo:JavaScript
Por meio do jQuery
Leia esta documentação para vanilla js ou esta documentação para jquery
fonte
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:
MAS o próprio elemento permanece sem o atributo:
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
Para fazer com que o DOM seja atualizado:
Se o atributo existe ou não, $ .attr sobrescreverá.
fonte
Tive um problema semelhante e no final tive que definir ambos
e
E depois disso
Espero que isto ajude.
fonte
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 chamadadata_user
e 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
fonte
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
Erros fáceis * - deve haver "dados-" no início do atributo que você deseja alterar.
fonte
Tive um problema semelhante, proponho esta solução embora não seja suportada no IE 10 e inferior.
Dado
O padrão Javascript define uma propriedade chamada dataset para atualizar data-example-update.
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
fonte
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 () .)
fonte