Datenattributwert kann nicht aktualisiert werden

88

Obwohl es im Web einige Beispiele dafür gibt, scheint es nicht richtig zu funktionieren. Ich kann das Problem nicht herausfinden.

Ich habe dieses einfache HTML

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

Jedes Mal, wenn ich auf den Link "Datenwert ändern" klicke, möchte ich den Datenwert von data-num aktualisieren. Zum Beispiel muss es 1,2,3,4, ... sein (plus 1 jedes Mal, wenn ich auf den Link klicke)

was ich habe ist

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

Der Wert ändert sich jedes Mal einmal von 0 auf 1. Ich kann es nicht inkrementell machen. Irgendwelche Vorschläge, was ich falsch mache?

dev
quelle
5
Daten- ist nur ein Attribut beim Laden der Seite. Daten werden in den Dom geladen und dort mit manipuliert .data(). Das Attribut wird nicht aktualisiert und sollte nicht zum Speichern oder Abrufen von Daten verwendet werden, sondern nur zum anfänglichen Festlegen von Daten.
Nigel Angel
1
@NigelAngel Falsch. Der Zweck des Datenattributs besteht darin, ein Mittel bereitzustellen, mit dem Benutzer beliebige Daten speichern (und ändern) können, für die kein anderer gültiger Speicherort vorhanden ist. Ein Beispiel hierfür wäre für Fremdwährung, wenn der Dezimalpunkt ein Komma ist. Für numerische Berechnungen müssen Sie irgendwo einen richtigen Wert mit einem tatsächlichen Dezimalpunkt speichern. Wenn dies ein Gesamtpreis ist und aufgrund von Änderungen aktualisiert werden muss, muss sich dieser Datenwert erneut ändern, und daher müssen Sie ihn aktualisieren können. Dafür würden Sie die .attr ()
jezzipin

Antworten:

61

DIE ANTWORT UNTEN IST DIE GUTE

Sie verwenden die Datenmethode nicht richtig. Der richtige Code zum Aktualisieren von Daten lautet:

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

Ihr Beispiel wäre also:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Lucas Willems
quelle
95
Dies ist falsch, dies ist die falsche Methode, um ein Attribut zu aktualisieren
Adeneo
2
Ja, ich stimme Ihnen zu @adeneo, aber er verwendet die Datenmethode nicht richtig. Warum diese Art von Attribut verwenden, wenn Sie es mit der attr-Methode aktualisieren möchten?
Lucas Willems
@dev Ich habe meine Antwort bearbeitet und den gesamten Code hinzugefügt, den Sie verwenden müssen.
Lucas Willems
7
Das ist interessant. Ich kann sehen, dass sich der Wert in der Konsole ändert. Aber wenn ich mir das HTML mit Chrome ansehe, ist es 0 (initial). Ich denke, es ist in Ordnung, wenn ich später den letzten Wert (zum Beispiel 5) abrufen kann
dev
6
Wie @dev sagte, habe ich versucht und gesehen, dass sich das in jQuery geändert hat, aber HTML in Chrome und Safari nicht beeinflusst. Also entscheide ich mich für attr () statt data ().
QMaster
115

Verwenden Sie dies stattdessen, wenn Sie das Attribut data-num des Knotenelements und nicht des Datenobjekts ändern möchten :

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: Aber Sie sollten das data () - Objekt in praktisch allen Fällen verwenden, aber nicht in allen ...

A. Wolff
quelle
7
Daten werden in den Dom geladen und dort mit .data () bearbeitet. Das Attribut wird nicht aktualisiert und sollte nicht zum Speichern oder Abrufen von Daten verwendet werden, sondern nur zum anfänglichen Festlegen von Daten. Dies ist zwar eine Möglichkeit, ein Attribut zu ändern ( .prop()wird bevorzugt), aber nicht die richtige Art, Daten zu verwenden.
Nigel Angel
4
.prop()greift auf den Wert einer Eigenschaft oder eines Attributs im DOM zu oder ändert ihn, jedoch nicht auf den HTML-Code. .attr()greift auf HTML zu und schreibt es neu, was es langsamer macht als .prop(). Sie sollten nicht .attr()stattdessen verwenden .data(), nicht nur, weil es langsamer ist, sondern weil es nicht so funktionieren soll. jsfiddle.net/eXA76/2
Nigel Angel
1
Ich denke, diese Antwort sollte gelöscht werden, da sie schlechte Ratschläge zur Verwendung von Daten gibt ().
Nigel Angel
2
Ja, die jQuery dokumentiert, wie es verwendet werden soll! api.jquery.com/data Daten werden beim Laden des Dokuments in einer globalen Variablen gespeichert. Das Verweisen über das Attribut funktioniert nicht, wenn ein anderer Entwickler, ein Plugin oder ein Skript die Daten mithilfe korrekt aktualisiert .data(). Wenn Sie die richtige Methode ignorieren und das Attribut verwenden, können Sie wissentlich Probleme verursachen.
Nigel Angel
4
@NigelAngel Obwohl ich Ihre Meinung dazu schätze, sind Daten nicht immer die beste Option. Was ist, wenn Sie den Wert eines Datenattributs aktualisieren und im Dom anzeigen lassen sowie den zugrunde liegenden Wert ändern müssen, der dann von CSS oder sogar Javascript verwendet wird? Der beste Ansatz ist normalerweise die Verwendung von .data (), wenn Sie den Wert in keiner Weise aus Javascript aktualisieren. Wenn dies jedoch der Fall ist, verwenden Sie immer .attr (), um den Wert festzulegen und abzurufen.
Jezzipin
30

Wenn wir diese Attribute mit vorhandenen, nativen abzurufen oder aktualisieren wollten JavaScript , dann können wir tun , um die Verwendung getAttributeund setAttributeMethoden wie unten dargestellt:

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>

Durch 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'); 

Lesen Sie diese Dokumentation für Vanilla Js oder diese Dokumentation für JQuery

Lalit Kumar Maurya
quelle
@ Nigel Angel, hast du es auf Firefox getestet? $ (this) .data ('Frucht') funktioniert nicht mit Firefox.
Lalit Kumar Maurya
Vielen Dank für den letzten Rat "Sie müssen es wie folgt einstellen, um den Wert zu aktualisieren. Dann erhalten Sie den aktualisierten Wert". Seltsames Verhalten in jquery ..
jgr
12

Für mich hat die Verwendung von Jquery lib 2.1.1 NICHT wie erwartet funktioniert:

Festlegen des Attributwerts für Elementdaten:

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

ABER das Element selbst bleibt ohne das Attribut:

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

Ich musste das DOM aktualisieren, damit ich später $ ('. My-class [data-num = "myValue"]') // aktuelle Länge 0 machen konnte

Also musste ich tun

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

So aktualisieren Sie das DOM:

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

Ob das Attribut vorhanden ist oder nicht, $ .attr wird überschrieben.

Brian Ogden
quelle
1
Ich habe das gleiche Problem mit jquery 2.1.1!
Phlegx
8

Hatte ein ähnliches Problem und am Ende musste ich beide einstellen

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

und

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

Und danach

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

Hoffe das hilft.

Krist0K
quelle
6

Grundsätzlich gibt es zwei Möglichkeiten, den Datenattributwert festzulegen / zu aktualisieren, abhängig von Ihren Anforderungen. Der Unterschied ist nur, wo die Daten gespeichert werden,

Wenn Sie es verwenden .data(), wird es in einer lokalen Variablen namens aufgerufen data_userund ist bei der Elementprüfung nicht sichtbar. Wenn Sie es verwenden, ist .attr()es öffentlich sichtbar.

Viel klarere Erklärung zu diesem Kommentar

Sphro
quelle
2

Diese Antwort ist für diejenigen gedacht, die nur den Wert eines Datenattributs ändern möchten

Der vorgeschlagene Wert ändert den Wert Ihres Jquery-Datenattr nicht korrekt, wie @adeneo angegeben hat. Aus irgendeinem Grund sehe ich jedoch nicht, dass er (oder andere) die richtige Methode für diejenigen veröffentlicht, die ihre Datenattr aktualisieren möchten. Die Antwort, die @Lucas Willems gepostet hat, ist möglicherweise die Antwort auf das Problem, das Brian Tompsett - 汤 莱恩 hat, aber es ist nicht die Antwort auf die Anfrage, die andere Benutzer hierher bringt.

Schnelle Antwort in Bezug auf die ursprüngliche Anfrageerklärung

-Um Datenattr zu aktualisieren

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

Einfache Fehler * - Am Anfang Ihres Attributs muss "data-" stehen, dessen Wert Sie ändern möchten.

MattOlivos
quelle
2

Hatte ein ähnliches Problem, schlage ich vor, dass diese Lösung in IE 10 und darunter nicht unterstützt wird.

Gegeben

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

Der Javascript-Standard definiert eine Eigenschaft namens Dataset zum Aktualisieren der Datenbeispielaktualisierung.

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

Hinweis: Verwenden Sie die Kamelschreibweise, um auf das richtige Datenattribut zuzugreifen.

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

Giovanni Romio
quelle
1

Ich hatte das gleiche Problem, dass das HTML-Daten-Tag nicht aktualisiert wurde, als ich jquery verwendete. Aber das Ändern des Codes, der die eigentliche Arbeit erledigt, von jquery zu javascript funktionierte.

Versuchen Sie dies, wenn Sie auf die Schaltfläche klicken : (Beachten Sie, dass der Hauptcode die Funktion Javascripts setAttribute () ist.)

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

});
Gash
quelle