No se puede actualizar el valor del atributo de datos

91

Aunque hay algunos ejemplos sobre esto en la web, no parece funcionar correctamente. No puedo resolver el problema.

Tengo este html simple

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

Cada vez que hago clic en el enlace "cambiar valor de datos" quiero actualizar el valor de datos de data-num. Por ejemplo, necesito que sea 1,2,3,4, ... (más 1 cada vez que hago clic en el enlace)

lo que tengo es

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

El valor cambia una vez de 0 a 1 cada vez. No puedo hacerlo incremental. ¿Alguna sugerencia de lo que estoy haciendo mal?

dev
fuente
5
data- es solo un atributo en la carga de la página. Los datos se cargan en el dom y se manipulan allí usando .data(). El atributo no se actualiza y no debe usarse para almacenar o recuperar datos, solo para establecer datos inicialmente.
Nigel Angel
1
@NigelAngel Mal. El propósito del atributo de datos es proporcionar un medio por el cual los usuarios pueden almacenar (y modificar) datos arbitrarios que no tienen ningún otro lugar válido a donde ir. Y ejemplo de esto sería para moneda extranjera cuando el punto decimal es una coma. Para cálculos numéricos con esto, debe almacenar un valor adecuado con un punto decimal real en alguna parte. Si este es un precio total y debe actualizarse en función de los cambios, nuevamente este valor de datos tendría que cambiar y, por lo tanto, debe poder actualizarlo. Para esto, usaría .attr ()
jezzipin

Respuestas:

64

LA RESPUESTA A CONTINUACIÓN ES LA BUENA

No está utilizando el método de datos correctamente. El código correcto para actualizar los datos es:

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

Entonces tu ejemplo sería:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Lucas Willems
fuente
97
Esto está mal, este es el método incorrecto para actualizar un atributo
adeneo
2
Sí, estoy de acuerdo contigo @adeneo pero no está usando el método de datos correctamente. ¿Por qué utilizar este tipo de atributo si desea actualizarlo con el método attr?
Lucas Willems
@dev edité mi respuesta y agregué todo el código que tienes que usar.
Lucas Willems
7
Esto es interesante. Puedo ver que el valor cambia en la consola. Pero cuando miro el html usando Chrome, es 0 (inicial). Supongo que está bien si más adelante puedo recuperar el último valor (por ejemplo, 5)
dev
6
Como dijo @dev, probé y vi que eso cambió en jQuery pero no afecta html en Chrome y Safari. Entonces decido usar attr () en lugar de data ().
QMaster
118

Úselo en su lugar, si desea cambiar el atributo número de datos del elemento de nodo, no del objeto de datos :

MANIFESTACIÓN

$('#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);
});

PD: pero deberías usar el objeto data () en prácticamente todos los casos, pero no en todos ...

A. Wolff
fuente
7
Los datos se cargan en el dom y se manipulan allí usando .data (). El atributo no se actualiza y no debe usarse para almacenar o recuperar datos, solo para establecer datos inicialmente. Si bien esta es una forma de cambiar un atributo ( .prop()se prefiere), no es la forma correcta de utilizar los datos.
Nigel Angel
4
.prop()accederá o alterará el valor de cualquier propiedad o atributo en el DOM pero no el HTML. .attr()accederá y reescribirá HTML, lo que lo hace más lento que .prop(). No debe usar en .attr()lugar de .data(), no solo porque es más lento, sino porque no es así como se supone que funciona. jsfiddle.net/eXA76/2
Nigel Angel
1
Creo que esta respuesta debería eliminarse porque da malos consejos sobre el uso de datos ().
Nigel Angel
2
Sí, ¡los documentos de jQuery sobre cómo se supone que debe usarse! api.jquery.com/data Los datos se almacenan en una variable global al cargar el documento. Hacer referencia a él a través del atributo NO FUNCIONARÁ si otro desarrollador, complemento o script actualiza correctamente los datos usando .data(). Al ignorar el método correcto y usar el atributo, se dirige a causar problemas a sabiendas.
Nigel Angel
4
@NigelAngel Aunque aprecio tu opinión sobre esto, los datos no siempre son la mejor opción para usar. ¿Qué sucede si necesita actualizar el valor de un atributo de datos y que se muestre en el dom, así como cambiar el valor subyacente que luego usa CSS o incluso Javascript? El mejor enfoque suele ser usar .data () si no está actualizando el valor de ninguna manera desde Javascript, pero si es así, use siempre .attr () tanto para establecer como para recuperar el valor.
jezzipin
30

Si quisiéramos recuperar o actualizar estos atributos usando JavaScript nativo existente , entonces podemos hacerlo usando los métodos getAttributey setAttributecomo se muestra a continuación:

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>

A través de 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'); 

Lea esta documentación para vanilla js o esta documentación para jquery

Lalit Kumar Maurya
fuente
@Nigel Angel, ¿lo has probado en firefox? $ (this) .data ('fruit') no funciona en Firefox.
Lalit Kumar Maurya
Muchas gracias por el último consejo "Tienes que configurarlo como se muestra a continuación para actualizar el valor. Entonces obtendrás el valor actualizado", comportamiento extraño en jquery ..
jgr
12

Para mí, al usar Jquery lib 2.1.1 lo siguiente NO funcionó de la manera que esperaba:

Establecer valor de atributo de datos de elemento:

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

PERO el elemento en sí permanece sin el atributo:

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

Necesitaba el DOM actualizado para luego poder hacer $ ('. My-class [data-num = "myValue"]') // la longitud actual es 0

Así que tuve que hacer

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

Para que el DOM se actualice:

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

Si el atributo existe o no, $ .attr se sobrescribirá.

Brian Ogden
fuente
1
¡Tengo el mismo problema con jquery 2.1.1!
phlegx
8

Tuve un problema similar y al final tuve que configurar ambos

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

y

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

Y despues de esto

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

Espero que esto ayude.

Krist0K
fuente
6

Básicamente, hay dos formas de establecer / actualizar el valor del atributo de datos, según sus necesidades. La diferencia es solo, dónde se guardaron los datos,

Si lo usa .data(), se guardará en la variable local llamada data_usery no .attr()será visible en la inspección del elemento. Si lo usa , será visible públicamente.

Explicación mucho más clara sobre este comentario.

Andang Rian Dimas
fuente
2

Esta respuesta es para aquellos que buscan simplemente cambiar el valor de un atributo de datos

Lo sugerido no cambiará el valor de su attr de datos de Jquery correctamente como ha indicado @adeneo. Sin embargo, por alguna razón, no lo veo (ni a ningún otro) publicar el método correcto para aquellos que buscan actualizar su data-attr. La respuesta que @Lucas Willems ha publicado puede ser la respuesta al problema que Brian Tompsett - 汤 莱恩 está teniendo, pero no es la respuesta a la consulta que puede traer a otros usuarios aquí.

Respuesta rápida con respecto a la declaración de consulta original

-Para actualizar data-attr

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

Errores fáciles *: debe haber "datos-" al comienzo del atributo del que desea cambiar el valor.

MattOlivos
fuente
2

Tuve un problema similar, propongo esta solución, aunque no es compatible con IE 10 y versiones anteriores.

Dado

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

El estándar Javascript define una propiedad llamada conjunto de datos para actualizar data-example-update.

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

Nota: utilice la notación de mayúsculas y minúsculas para acceder al atributo de datos correcto.

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

Giovanni Romio
fuente
1

Tuve el mismo problema de que la etiqueta de datos html no se actualizaba cuando estaba usando jquery, pero cambiar el código que hace el trabajo real de jquery a javascript funcionó.

Intente usar esto cuando se haga clic en el botón: (Tenga en cuenta que el código principal es la función setAttribute () de Javascripts ) .

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

});
Tajo
fuente