obtener atributos de datos en código JavaScript


144

Tengo el siguiente html:

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

¿Es posible obtener los atributos que comienzan data-y usarlos en el código JavaScript como el código a continuación? Por ahora me sale nullcomo resultado.

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

En la actualidad (2019) también es posible usar la propiedad del conjunto de datos del nodo con nodos SVG (!), Ver la respuesta a continuación o usar con D3 .
Peter Krauss

Respuestas:


173

Necesita acceder a la datasetpropiedad :

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

Resultado:

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

2
Tenga en cuenta que, según MDN, el estándar de conjuntos de datos no funcionará para Internet Explorer <11. developer.mozilla.org/en-US/docs/Learn/HTML/Howto/… "Para admitir IE 10 y menos, debe acceder atributos de datos con getAttribute () en su lugar ".
Djonatan


27

Puedes acceder a él como

element.dataset.points

etc. Entonces en este caso: this.dataset.points


7

También puede obtener los atributos con el método getAttribute () que devolverá el valor de un atributo HTML específico.

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

si está apuntando al atributo de datos en el elemento Html,

document.dataset no trabajará

Deberías usar

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

o

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

1

Los navegadores modernos aceptan HTML y SVG DOMnode.dataset

Uso de la propiedad de conjunto de datos de nodo DOM de Javascript puro .

Es un antiguo estándar Javascript para elementos HTML (desde Chorme 8 y Firefox 6) pero nuevo para SVG (desde el año 2017 con Chorme 55.xy Firefox 51) ... No es un problema para SVG porque en la actualidad (2019) El uso compartido de la versión está dominado por los navegadores modernos.

Los valores de los valores-clave del conjunto de datos son cadenas puras, pero una buena práctica es adoptar el formato de cadena JSON para tipos de datos que no sean cadenas, para analizarlo JSON.parse().

Usar la propiedad del conjunto de datos en cualquier contexto

Fragmento de código para obtener y establecer conjuntos de datos de valores clave en contextos HTML y 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

Alrededor de 2019, usando jquery, se puede acceder a esto usando $('#DOMId').data('typeId')donde $('#DOMId')está el selector de jquery para su elemento span.


-10

Pruebe esto en lugar de su código:

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

15
Asker no mencionó jQuery, esto ni siquiera es bueno jQuery para este propósito. Debería ser .data('type');en su lugar.
Colin DeClue

2
Y además de eso, la sugerencia de usar este "en lugar de su código" es demasiado amplia; el Asker querría mantener la configuración de manejo de eventos y el JSONresultado, no uno alert del data-typeatributo.
Trincot

1
esto es jquery, no puro javascript.
user3130012
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.