Impossible de mettre à jour la valeur de l'attribut de données

91

Bien qu'il existe quelques exemples à ce sujet sur le Web, cela ne semble pas fonctionner correctement. Je ne peux pas comprendre le problème.

J'ai ce simple html

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

Chaque fois que je clique sur le lien «modifier la valeur des données», je souhaite mettre à jour la valeur des données de data-num. Par exemple, j'en ai besoin pour 1,2,3,4, ... (plus 1 à chaque fois que je clique sur le lien)

ce que j'ai c'est

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

La valeur change une fois de 0 à 1 à chaque fois. Je ne peux pas le faire progressivement. Des suggestions sur ce que je fais mal?

dev
la source
5
data- n'est qu'un attribut lors du chargement de la page. Les données sont chargées dans le dom et y sont manipulées à l'aide de .data(). L'attribut n'est pas mis à jour et ne doit pas être utilisé pour stocker ou récupérer des données, uniquement pour les données initialement définies.
Nigel Angel
1
@NigelAngel Wrong. Le but de l'attribut data est de fournir un moyen par lequel les utilisateurs peuvent stocker (et modifier) ​​des données arbitraires qui n'ont aucun autre endroit valide où aller. Et un exemple de ceci serait pour les devises étrangères lorsque le point décimal est une virgule. Pour les calculs numériques avec cela, vous devez stocker une valeur correcte avec un point décimal réel quelque part. S'il s'agit d'un prix total et qu'il doit être mis à jour en fonction des modifications, cette valeur de données devra à nouveau changer et vous devez donc pouvoir la mettre à jour. Pour cela, vous utiliseriez le .attr ()
jezzipin

Réponses:

64

LA RÉPONSE CI-DESSOUS EST LA BONNE

Vous n'utilisez pas correctement la méthode de données . Le code correct pour mettre à jour les données est:

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

Donc, votre exemple serait:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Lucas Willems
la source
97
C'est faux, c'est la mauvaise méthode pour mettre à jour un attribut
adeneo
2
Oui, je suis d'accord avec vous @adeneo mais il n'utilise pas correctement la méthode de données. Pourquoi utiliser ce type d'attribut si vous souhaitez le mettre à jour avec la méthode attr?
Lucas Willems
@dev j'ai édité ma réponse et ajouté tout le code que vous devez utiliser.
Lucas Willems
7
C'est intéressant. Je peux voir que la valeur change dans la console. Mais quand je regarde le html en utilisant Chrome, c'est 0 (initial). Je suppose que c'est ok si plus tard je peux récupérer la dernière valeur (par exemple 5)
dev
6
Comme @dev l'a dit, j'ai essayé et vu que cela avait changé dans jQuery mais n'affectait pas le HTML dans Chrome et Safari. Je décide donc d'utiliser attr () plutôt que data ().
QMaster
118

Utilisez-le à la place, si vous souhaitez modifier l'attribut data-num de l'élément node, pas de l'objet data :

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: mais vous devriez utiliser l'objet data () dans pratiquement tous les cas, mais pas tous ...

A. Wolff
la source
7
Les données sont chargées dans le dom et y sont manipulées à l'aide de .data (). L'attribut n'est pas mis à jour et ne doit pas être utilisé pour stocker ou récupérer des données, uniquement pour les données initialement définies. Bien que ce soit une façon de modifier un attribut ( .prop()c'est préférable), ce n'est pas la bonne façon d'utiliser les données.
Nigel Angel
4
.prop()accédera ou modifiera la valeur de toute propriété ou attribut dans le DOM mais pas le HTML. .attr()accédera et réécrira le HTML, ce qui le rend plus lent que .prop(). Vous ne devriez pas utiliser à la .attr()place de .data(), non seulement parce que c'est plus lent, mais parce que ce n'est pas ainsi que cela est censé fonctionner. jsfiddle.net/eXA76/2
Nigel Angel
1
Je pense que cette réponse devrait être supprimée car elle donne de mauvais conseils sur l'utilisation de data ().
Nigel Angel
2
Oui, la documentation jQuery explique comment il est censé être utilisé! Les données api.jquery.com/data sont stockées dans une variable globale lors du chargement du document. Le référencer via l'attribut NE FONCTIONNE PAS si un autre développeur, plugin ou script met correctement à jour les données en utilisant .data(). En ignorant la méthode correcte et en utilisant l'attribut, vous vous dirigez vers des problèmes sciemment.
Nigel Angel
4
@NigelAngel Bien que j'apprécie votre opinion à ce sujet, les données ne sont pas toujours la meilleure option à utiliser. Que faire si vous avez besoin de mettre à jour la valeur d'un attribut de données et de l'afficher dans le domaine ainsi que de modifier la valeur sous-jacente qui est ensuite utilisée par CSS ou même Javascript? La meilleure approche est généralement d'utiliser .data () si vous ne mettez pas à jour la valeur de quelque manière que ce soit à partir de Javascript, mais si c'est le cas, utilisez toujours .attr () pour définir et récupérer la valeur.
jezzipin
30

Si nous voulions récupérer ou mettre à jour ces attributs à l'aide de JavaScript natif existant, nous pouvons le faire en utilisant les méthodes getAttributeet setAttributecomme indiqué ci-dessous:

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>

Grâce à 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'); 

Lisez cette documentation pour vanilla js ou cette documentation pour jquery

Lalit Kumar Maurya
la source
@Nigel Angel, l'avez-vous testé sur Firefox? $ (this) .data ('fruit') ne fonctionne pas sur Firefox.
Lalit Kumar Maurya
Merci beaucoup pour le dernier conseil "Vous devez le définir comme ci-dessous pour mettre à jour la valeur. Ensuite, vous obtiendrez la valeur mise à jour" Un comportement étrange dans jquery ..
jgr
12

Pour moi, en utilisant Jquery lib 2.1.1, ce qui suit n'a PAS fonctionné comme je m'y attendais:

Définir la valeur d'attribut de données d'élément:

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

MAIS l'élément lui-même reste sans l'attribut:

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

J'avais besoin de mettre à jour le DOM pour pouvoir faire plus tard $ ('. My-class [data-num = "myValue"]') // la longueur actuelle est de 0

Alors je devais faire

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

Pour mettre à jour le DOM:

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

Que l'attribut existe ou non, $ .attr sera écrasé.

Brian Ogden
la source
1
J'ai le même problème avec jquery 2.1.1!
phlegx
8

J'ai eu un problème similaire et à la fin j'ai dû régler les deux

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

et

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

Et après ça

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

J'espère que cela t'aides.

Krist0K
la source
6

Fondamentalement, il existe deux façons de définir / mettre à jour la valeur de l'attribut de données, en fonction de vos besoins. La différence est juste, où les données sont enregistrées,

Si vous l'utilisez, .data()il sera enregistré dans la variable locale appelée data_user, et ne sera pas visible lors de l'inspection de l'élément.Si vous l'utilisez, .attr()il sera visible publiquement.

Explication beaucoup plus claire sur ce commentaire

Andang Rian Dimas
la source
2

Cette réponse est pour ceux qui cherchent à changer simplement la valeur d'un attribut de données

La suggestion ne changera pas correctement la valeur de votre data-attr Jquery comme @adeneo l'a indiqué. Pour une raison quelconque, je ne le vois pas (ni aucun autre) publier la bonne méthode pour ceux qui cherchent à mettre à jour leur data-attr. La réponse que @Lucas Willems a publiée est peut-être la réponse au problème de Brian Tompsett - 汤 莱恩, mais ce n'est pas la réponse à la demande qui pourrait amener d'autres utilisateurs ici.

Réponse rapide en ce qui concerne la déclaration d'enquête originale

-Pour mettre à jour les données-attr

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

Erreurs faciles * - il doit y avoir "data-" au début de votre attribut dont vous souhaitez modifier la valeur.

MattOlivos
la source
2

Eu un problème similaire, je propose cette solution même si elle n'est pas prise en charge dans IE 10 et moins.

Donné

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

Le standard Javascript définit une propriété appelée dataset pour mettre à jour data-example-update.

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

Remarque: utilisez la notation en cas de chameau pour accéder à l'attribut de données correct.

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

Giovanni Romio
la source
1

J'ai eu le même problème de la balise de données html ne se mettant pas à jour lorsque j'utilisais jquery Mais changer le code qui fait le travail réel de jquery à javascript a fonctionné.

Essayez d'utiliser ceci lorsque vous cliquez sur le bouton: (Notez que le code principal est la fonction 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);

});
Entaille
la source