ottenere attributi di dati nel codice JavaScript


144

Ho il prossimo html:

<span data-typeId="123" data-type="topic" data-points="-1" data-important="true" id="the-span"></span>

È possibile ottenere gli attributi che iniziano con data-e usarli nel codice JavaScript come il codice qui sotto? Per ora ottengo nullcome risultato.

document.getElementById("the-span").addEventListener("click", function(){
    var json = JSON.stringify({
        id: parseInt(this.typeId),
        subject: this.datatype,
        points: parseInt(this.points),
        user: "H. Pauwelyn"
    });
});

Al giorno d'oggi (2019) è anche possibile utilizzare la proprietà del set di dati del nodo con nodi SVG (!), Vedere la risposta di seguito o utilizzare con D3 .
Peter Krauss,

Risposte:


173

Devi accedere alla datasetproprietà :

document.getElementById("the-span").addEventListener("click", function() {
  var json = JSON.stringify({
    id: parseInt(this.dataset.typeid),
    subject: this.dataset.type,
    points: parseInt(this.dataset.points),
    user: "Luïs"
  });
});

Risultato:

// json would equal:
{ "id": 123, "subject": "topic", "points": -1, "user": "Luïs" }

2
Tieni presente che, secondo MDN, lo standard dei set di dati non funzionerà per Internet Explorer <11. developer.mozilla.org/en-US/docs/Learn/HTML/Howto/… "Per supportare IE 10 e sotto devi accedere attributi di dati con getAttribute () invece. "
Djonatan,


27

Puoi accedervi come

element.dataset.points

ecc. Quindi in questo caso: this.dataset.points


7

È inoltre possibile acquisire gli attributi con il metodo getAttribute () che restituirà il valore di un attributo HTML specifico.

var elem = document.getElementById('the-span');

var typeId = elem.getAttribute('data-typeId');
var type   = elem.getAttribute('data-type');
var points = elem.getAttribute('data-points');
var important = elem.getAttribute('data-important');

console.log(`typeId: ${typeId} | type: ${type} | points: ${points} | important: ${important}`
);
<span data-typeId="123" data-type="topic" data-points="-1" data-important="true" id="the-span"></span>


4

se stai prendendo di mira l'attributo di dati nell'elemento HTML,

document.dataset non funzionerà

dovresti usare

document.querySelector("html").dataset.pbUserId

o

document.getElementsByTagName("html")[0].dataset.pbUserId

1

I browser moderni accettano HTML e SVG DOMnode.dataset

Utilizzo della proprietà del set di dati del nodo DOM puro di Javascript .

È un vecchio standard Javascript per gli elementi HTML (da Chorme 8 e Firefox 6) ma nuovo per SVG (dall'anno 2017 con Chorme 55.xe Firefox 51) ... Non è un problema per SVG perché al giorno d'oggi (2019) la quota di utilizzo della versione è dominata dai browser moderni.

I valori dei valori-chiave del set di dati sono stringhe pure, ma è buona norma adottare il formato di stringa JSON per tipi di dati non stringa, per analizzarlo JSON.parse().

Utilizzo della proprietà del set di dati in qualsiasi contesto

Snippet di codice per ottenere e impostare set di dati di valori-chiave in contesti HTML e SVG.

console.log("-- GET values --")
var x = document.getElementById('html_example').dataset;
console.log("s:", x.s );
for (var i of JSON.parse(x.list)) console.log("list_i:",i)

var y = document.getElementById('g1').dataset;
console.log("s:", y.s );
for (var i of JSON.parse(y.list)) console.log("list_i:",i)

console.log("-- SET values --");
y.s="BYE!"; y.list="null";
console.log( document.getElementById('svg_example').innerHTML )
<p id="html_example" data-list="[1,2,3]" data-s="Hello123">Hello!</p>
<svg id="svg_example">
  <g id="g1" data-list="[4,5,6]" data-s="Hello456 SVG"></g>
</svg>


0

Intorno al 2019, usando jquery, è possibile accedervi usando $('#DOMId').data('typeId')dov'è $('#DOMId')il selettore jquery per l'elemento span.


-10

Prova questo invece del tuo codice:

var type=$("#the-span").attr("data-type");
alert(type);

15
Asker non ha menzionato jQuery, questo non è nemmeno un buon jQuery per questo scopo. Dovrebbe essere .data('type');invece.
Colin DeClue,

2
E per di più il suggerimento di usare questo "al posto del tuo codice" è decisamente troppo ampio; il richiedente vorrebbe mantenere l'impostazione della gestione degli eventi e il JSONrisultato, non uno alert degli data-typeattributi.
trincot

1
questo è jquery, non puro javascript.
user3130012
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.