Не удается обновить значение атрибута данных

91

Хотя в Интернете есть несколько примеров этого, похоже, что это работает некорректно. Я не могу понять в чем проблема.

У меня есть этот простой html

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

Каждый раз, когда я нажимаю ссылку «изменить значение данных», я хочу обновить значение данных для data-num. Например, мне нужно, чтобы это было 1,2,3,4, ... (плюс 1 каждый раз, когда я нажимаю ссылку)

что у меня есть

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

Значение меняется один раз с 0 на 1 каждый раз. Я не могу делать это постепенно. Есть предложения, что я делаю не так?

разработчик
источник
5
data- это только атрибут при загрузке страницы. Данные загружаются в дом и обрабатываются там с помощью .data(). Атрибут не обновляется и не должен использоваться для хранения или извлечения данных, только для первоначальной установки данных.
Найджел Энджел
1
@NigelAngel Неправильно. Назначение атрибута данных - предоставить средство, с помощью которого пользователи могут хранить (и изменять) произвольные данные, которым нет другого допустимого места. И примером этого может быть иностранная валюта, когда десятичная точка является запятой. Для численных расчетов с этим вы должны где-то сохранить правильное значение с фактической десятичной точкой. Если это общая цена, и ее необходимо обновить на основе изменений, тогда снова это значение данных должно измениться, и, следовательно, вы должны иметь возможность обновить его. Для этого вы должны использовать .attr ()
jezzipin

Ответы:

64

ОТВЕТ НИЖЕ ХОРОШИЙ

Вы неправильно используете метод данных . Правильный код для обновления данных:

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

Итак, ваш пример будет:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Лукас Виллемс
источник
97
Это неправильно, это неправильный метод обновления атрибута
adeneo
2
Да, я согласен с вами, @adeneo, но он неправильно использует метод данных. Зачем использовать такой атрибут, если вы хотите обновить его с помощью метода attr?
Lucas Willems
@dev я отредактировал свой ответ и добавил весь код, который вам нужно использовать.
Lucas Willems
7
Это интересно. Я вижу, что значение в консоли меняется. Но когда я смотрю на html с помощью Chrome, он равен 0 (начальный). Я думаю, это нормально, если позже я смогу получить последнее значение (например, 5)
dev
6
Как сказал @dev, я попытался и увидел, что это изменилось в jQuery, но не повлияло на html в Chrome и Safari. Поэтому я решил использовать attr (), а не data ().
QMaster
118

Используйте это вместо этого, если вы хотите изменить номер данных атрибута элемента узла, а не объекта данных :

ДЕМО

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

PS: но вы должны использовать объект data () практически во всех случаях, но не во всех ...

А. Вольф
источник
7
Данные загружаются в дом и обрабатываются там с помощью .data (). Атрибут не обновляется и не должен использоваться для хранения или извлечения данных, только для первоначальной установки данных. Хотя это один из способов изменения атрибута ( .prop()предпочтительно), это неправильный способ использования данных.
Найджел Энджел
4
.prop()будет обращаться или изменять значение любого свойства или атрибута в DOM, но не в HTML. .attr()будет обращаться к HTML и перезаписывать его, что делает его медленнее, чем .prop(). Вы не должны использовать .attr()вместо .data(), не только потому, что он медленнее, а потому, что он не должен работать так. jsfiddle.net/eXA76/2
Найджел Энджел
1
Я думаю, что этот ответ следует удалить, потому что он дает плохой совет по использованию data ().
Найджел Энджел
2
Да, jQuery описывает, как его использовать! Данные api.jquery.com/data сохраняются в глобальной переменной при загрузке документа. Ссылка на него через атрибут НЕ БУДЕТ РАБОТАТЬ, если другой разработчик, плагин или скрипт правильно обновляет данные, используя .data(). Игнорируя правильный метод и используя атрибут, вы идете к сознательному возникновению проблем.
Найджел Энджел
4
@NigelAngel Хотя я ценю ваше мнение по этому поводу, данные не всегда лучший вариант для использования. Что если вам нужно обновить значение атрибута данных и отобразить его в dom, а также фактически изменить базовое значение, которое затем используется CSS или даже Javascript? Лучшим подходом, как правило, является использование .data (), если вы не обновляете значение каким-либо образом из Javascript, но если да, всегда используйте .attr () как для установки, так и для получения значения.
jezzipin
30

Если мы хотим , чтобы восстановить или обновить эти атрибуты , используя существующую, родную JavaScript , то мы можем сделать это , используя getAttributeи setAttributeметоды , как показано ниже:

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>

Через 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'); 

Прочтите эту документацию для vanilla js или эту документацию для jquery

Лалит Кумар Маурья
источник
@Nigel Angel, на firefox тестировали? $ (this) .data ('fruit') не работает в firefox.
Лалит Кумар Маурья
Большое спасибо за последний совет «Для обновления значения вы должны установить его, как
показано
12

Для меня, используя Jquery lib 2.1.1, следующее НЕ работало так, как я ожидал:

Установить значение атрибута данных элемента:

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

НО сам элемент остается без атрибута:

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

Мне нужно было обновить DOM, чтобы позже я мог сделать $ ('. My-class [data-num = "myValue"]') // текущая длина равна 0

Так что мне пришлось сделать

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

Чтобы обновить DOM:

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

Независимо от того, существует атрибут или нет, $ .attr будет перезаписан.

Брайан Огден
источник
1
У меня такая же проблема с jquery 2.1.1!
phlegx
8

Была аналогичная проблема, и в конце концов мне пришлось установить оба

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

а также

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

И после этого

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

Надеюсь это поможет.

Krist0K
источник
6

В принципе, есть два способа установить / обновить значение атрибута данных, в зависимости от ваших потребностей. Разница лишь в том, где сохраняются данные,

Если вы используете, .data()он будет сохранен в локальной переменной с именем data_user, и его не будет видно при проверке элемента. Если вы используете.attr() его он будет общедоступным.

Более четкое объяснение этого комментария

Анданг Риан Димас
источник
2

Этот ответ предназначен для тех, кто хочет просто изменить значение атрибута данных.

Предлагаемое не изменит значение вашего атрибута данных JQuery правильно, как заявил @adeneo. Однако по какой-то причине я не вижу, чтобы он (или кто-либо другой) опубликовал правильный метод для тех, кто хочет обновить свой data-attr. Ответ, который опубликовал @Lucas Willems, может быть ответом на проблему Брайана Томпсетта - 汤 莱恩, но это не ответ на запрос, который может привести сюда других пользователей.

Быстрый ответ на исходный запрос

-Для обновления data-attr

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

Легкие ошибки * - в начале атрибута, значение которого вы хотите изменить, должны быть "данные-".

МэттОливос
источник
2

Если бы возникла аналогичная проблема, я предлагаю это решение, хотя оно не поддерживается в IE 10 и ниже.

Дано

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

Стандарт Javascript определяет свойство, называемое набором данных, для обновления data-example-update.

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

Примечание: используйте верблюжий регистр для доступа к правильному атрибуту данных.

Источник: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes

Джованни Ромио
источник
1

У меня была та же проблема, что тег данных html не обновлялся, когда я использовал jquery, но сработало изменение кода, который выполняет фактическую работу с jquery на javascript.

Попробуйте использовать это при нажатии кнопки: (Обратите внимание, что основной код - это функция Javascripts setAttribute () .)

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

});
Gash
источник