Cómo establecer atributos de datos en elementos HTML


Tengo un div con un atributo data-myval = "10". Quiero actualizar su valor; ¿no cambiaría si utilizo div.data('myval',20)? ¿Necesito usar solo div.attr('data-myval','20')?

¿Me estoy confundiendo entre HTML5 y jQuery? Por favor avise. ¡Gracias!

EDITAR: Actualizado div.data('myval')=20 a div.data('myval',20), pero aún así el HTML no se está actualizando.

Author: Pulkit Mittal, 2012-11-23

6 answers

HTML

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

JS

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

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

Demo

Referencia

EDITAR (después del comentario):

Si se comprueba la referencia dada anteriormente, que dice:

JQuery usa el método .data() para guardar información bajo los nombres 'events' y 'handle', y también reserva cualquier nombre de datos que comience con un guion bajo ('_') para uso interno.

¿Por qué tendría que cambiar html?

Si se cambia el html es absolutamente necesario, debes usar .attr()

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>

Ver esta demo

 294
Author: Jashwant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 06:20:30

Tenga en cuenta que jQuery .data() no se actualiza cuando cambia los atributos html5 data- con javascript.

Si utiliza jQuery .data() para establecer atributos data- en elementos HTML, es mejor que utilice jQuery .data() para leerlos. De lo contrario, puede haber inconsistencias si actualiza los atributos dinámicamente. Por ejemplo, véase setAttribute(), dataset(), attr() abajo. Cambie el valor, presione el botón varias veces y vea la consola.

$("#button").on("click", function() {
  var field = document.querySelector("#textfield")

  switch ($("#method").val()) {
    case "setAttribute":
      field.setAttribute("data-customval", field.value)
      break;
    case "dataset":
      field.dataset.customval = field.value
      break;
    case "jQuerydata":
      $(field).data("customval", field.value)
      break;
    case "jQueryattr":
      $(field).attr("data-customval", field.value)
      break;
  }

  objValues = {}
  objValues['$(field).data("customval")'] = $(field).data("customval")
  objValues['$(field).attr("data-customval")'] = $(field).attr("data-customval")
  objValues['field.getAttribute("data-customval")'] = field.getAttribute("data-customval")
  objValues['field.dataset.customval'] = field.dataset.customval

  console.table([objValues])
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>Example</h1>
<form>
  <input id="textfield" type="text" data-customval="initial">
  <br/>
  <input type="button" value="Set and show in console.table (F12)" id="button">
  <br/>
  <select id="method">
    <option value="setAttribute">setAttribute</option>
    <option value="dataset">dataset</option>
    <option value="jQuerydata">jQuery data</option>
    <option value="jQueryattr">jQuery attr</option>
  </select>
  <div id="results"></div>
</form>
 26
Author: Johann Echavarria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-15 20:53:26

También puedes usar lo siguiente attr;

HTML

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

Script

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

O

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value
 24
Author: Baqer Naqvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-06 13:12:35

Solución javascript de vainilla

HTML

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

JavaScript:

  • Usando DOM's getAttribute() propiedad

     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
    
  • Usando JavaScript dataset propiedad

    var myval = mydiv.dataset.myval     //returns "10"
    mydiv.dataset.myval = '20'          //changes "data-myval" to "20"
    mydiv.dataset.myval = null          //removes "data-myval" attribute
    
 11
Author: rajesh kakawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-02 16:56:35

Si estás usando jQuery, usa .data():

div.data('myval', 20);

Puede almacenar datos arbitrarios con .data(), pero está restringido a solo cadenas cuando usa .attr().

 6
Author: Blender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-23 06:31:45

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

El método jQuery .data() actualiza un objeto interno administrado por jQuery mediante el uso del método, si estoy en lo correcto.

Si desea actualizar su data-attributes con un poco de propagación, utilice {

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

Otherwise de lo contrario, $('body').attr('data-test', 'text'); funcionará bien.

Otra forma de lograr esto es usando --

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

Restricts que restringe cualquier cambio de atributo a HTMLElement.prototype.dataset, no cualquier adicional HTMLElement.prototype.attributes.

 1
Author: Cody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-17 08:10:25