Come impostare gli attributi dei dati negli elementi HTML


233

Ho un div con un attributo data-myval = "10". Voglio aggiornarne il valore; non cambierebbe se uso div.data('myval',20)? Devo usare div.attr('data-myval','20')solo?

Mi sto confondendo tra HTML5 e jQuery? Si prega di avvisare. Grazie!

EDIT: aggiornato div.data('myval')=20a div.data('myval',20), ma l'HTML non si aggiorna ancora.


1
Cosa c'è dentro div? Un oggetto o elemento jQuery?
Brad,

2
div.data('myval')=20non funzionerebbe per memorizzare un valore solo perché la sintassi è errata - vedi le risposte per la sintassi corretta. Ma nota che in .data()realtà non aggiorna l' attributo element , archivia i dati altrove.
nnnnnn,

Per coloro che hanno il senso di evitare gQuery usare questo -> div.dataset.myval = '20';
Harijs Krūtainis,

Risposte:


448

HTML

<div id="mydiv" data-myval="10"></div>

JS

var a = $('#mydiv').data('myval'); //getter

$('#mydiv').data('myval',20); //setter

dimostrazione

Riferimento

Dal riferimento:

jQuery stesso utilizza il .data()metodo per salvare le informazioni sotto i nomi 'events' e 'handle', e inoltre riserva qualsiasi nome di dati che inizia con un trattino basso ('_') per uso interno.

Va notato che jQuery data()non modifica l' dataattributo in HTML.

Pertanto, se è necessario modificare l' dataattributo in HTML, è necessario utilizzare .attr()invece.

HTML

<div id="outer">
    <div id="mydiv" data-myval="10"></div>
</div>

JS:

alert($('#outer').html());   // alerts <div id="mydiv" data-myval="10"> </div>
var a = $('#mydiv').data('myval'); //getter
$('#mydiv').attr("data-myval","20"); //setter
alert($('#outer').html());   //alerts <div id="mydiv" data-myval="20"> </div>

Guarda questa demo


Non so che cosa avete bisogno di coerenza, ma mi sento di raccomandare a uso data()di gete setHTML-5 attributi dei dati.
Jashwant,

7
Invece @Jashwant potrebbe essere una modifica utile: pensa a una regola CSS come [data-myval="10"]{ color: red; }, modificherebbe il tag in base al valore dell'attributo di dati.
TechNyquist,

4
.data non funziona. .attr funziona. potremmo essere in grado di modificare la risposta per chiarire. sembra che la prima sia la soluzione, mentre potrebbe essere un po 'meglio esposta. non sono sicuro di come spiegare meglio, questo è il motivo per cui non modifico il post.
Gaucho,

@Gaucho, adesso va meglio?
Jashwant,

1
@Gaucho .data funzionerà solo se usi jQuery più recente> = 1.4.3, per le versioni precedenti .attr funzionerà.
Ilias,

41

Puoi anche usare la seguente attrcosa;

HTML

<div id="mydiv" data-myval="JohnCena"></div>

copione

 $('#mydiv').attr('data-myval', 'Undertaker'); // sets 
 $('#mydiv').attr('data-myval'); // gets

O

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value

6
Per me ha lavorato solo con .attr. È anche possibile?
Zariweya,

Sono contento che abbia funzionato. La chiamata .data () è speciale: non solo recupera gli attributi dei dati HTML5, ma tenta anche di valutare / analizzare gli attributi. Quindi con un attributo come data-myval = '{"hello": "world"}' quando recuperato tramite .data () restituirà un Oggetto mentre il recupero tramite .attr () restituirà una stringa.
Baqer Naqvi,

32

Si noti che jQuery .data()non viene aggiornato quando si modificano gli data-attributi html5 con javascript.

Se usi jQuery .data()per impostare gli data-attributi negli elementi HTML, è meglio usare jQuery .data()per leggerli. Altrimenti possono esserci incoerenze se si aggiornano gli attributi in modo dinamico. Ad esempio, vedere setAttribute(), dataset(), attr()di seguito. Modificare il valore, premere più volte il pulsante e vedere la console.


29

Soluzione Javascript alla vaniglia

HTML

<div id="mydiv" data-myval="10"></div>

JavaScript:

  • Utilizzando la getAttribute()proprietà di DOM

     var brand = mydiv.getAttribute("data-myval")//returns "10"
     mydiv.setAttribute("data-myval", "20")      //changes "data-myval" to "20"
     mydiv.removeAttribute("data-myval")         //removes "data-myval" attribute entirely
    
  • Utilizzando la datasetproprietà di JavaScript

    var myval = mydiv.dataset.myval     //returns "10"
    mydiv.dataset.myval = '20'          //changes "data-myval" to "20"
    mydiv.dataset.myval = null          //removes "data-myval" attribute
    

8

Se stai usando jQuery, usa .data():

div.data('myval', 20);

Puoi archiviare dati arbitrari con .data(), ma sei limitato a stringhe solo quando lo usi .attr().


14
Si noti che il .data()metodo non aggiorna gli data- attributi , ovvero i dati che archivia non finiscono in un attributo (motivo per cui può memorizzare valori non stringa) anche se può recuperare il valore da un data-attributo. Anche se sospetto che il PO non abbia davvero bisogno di impostare attributi anche se questo è quello che ha posto la domanda.
nnnnnn,

1
Non penso che sarebbe un problema (oltre a quello che hai menzionato, o se c'è altro codice che utilizza .attr()per recuperare l'attributo). Ho solo pensato che valesse la pena sottolineare che l'OP ha esplicitamente (se forse erroneamente) chiesto di aggiornare gli attributi.
nnnnnn,

1
@Blender questo non risponde davvero alla mia domanda. Voglio aggiornare l'HTML, ma allo stesso tempo usare element.data ('myval') per recuperarlo.
Pulkit Mittal,

1
Devo farlo perché gli elementi generati sul caricamento del documento hanno quelli come attributi di dati e voglio farlo anche per i nuovi elementi dinamici. So che potrebbe non esserci un'esigenza specifica per questo, ma voglio mantenere una coerenza.
Pulkit Mittal,

1
@PulkitMittal - Nota che anche .attr()se non aggiorni realmente "l'html", stai aggiornando il DOM. Quando chiedi al browser di fornirti il ​​"html" (da .html()o al DOM element.innerHTML), il browser lo sta effettivamente rigenerando in base allo stato del DOM in quel momento. Una specie di.
nnnnnn,

3

[jQuery] .data () vs .attr () vs .extend ()

Il metodo jQuery .data()aggiorna un oggetto interno gestito da jQuery attraverso l'uso del metodo, se corretto.

Se desideri aggiornare il tuo data-attributescon un po 'di diffusione, usa -

$('body').attr({ 'data-test': 'text' });

- altrimenti, $('body').attr('data-test', 'text');funzionerà bene.

Un altro modo per farlo è usare -

$.extend( $('body')[0].dataset, { datum: true } );

- che limita qualsiasi modifica dell'attributo a HTMLElement.prototype.dataset, non ulterioreHTMLElement.prototype.attributes .


2

Un altro modo per impostare l'attributo di dati è usare la proprietà del set di dati .

<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div>

const el = document.querySelector('#user');

// el.id == 'user'
// el.dataset.id === '1234567890'
// el.dataset.user === 'johndoe'
// el.dataset.dateOfBirth === ''

// set the data attribute
el.dataset.dateOfBirth = '1960-10-03'; 
// Result: el.dataset.dateOfBirth === 1960-10-03

delete el.dataset.dateOfBirth;
// Result: el.dataset.dateOfBirth === undefined

// 'someDataAttr' in el.dataset === false
el.dataset.someDataAttr = 'mydata';
// Result: 'someDataAttr' in el.dataset === true

0

Per mantenere sincronizzati jQuery e DOM, potrebbe essere una semplice opzione

$('#mydiv').data('myval',20).attr('data-myval',20);        
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.