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


91

Хоча є кілька прикладів про це в Інтернеті, схоже, це не працює належним чином. Я не можу зрозуміти проблему.

У мене є цей простий html

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

Кожного разу, коли я натискаю посилання "змінити значення даних", я хочу оновити значення даних з номером даних. Наприклад, мені потрібно, щоб це було 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(). Атрибут не оновлюється і не повинен використовуватися для зберігання або отримання даних, лише для початкового встановлення даних.
Найджел Енджел

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)
розробник

6
Як сказав @dev, я спробував побачити, що змінилося в jQuery, але не впливає на html у chrome та safari. Тому я вирішив використовувати attr (), а не data ().
QMaster

118

Використовуйте це замість цього, якщо ви хочете змінити атрибут data-number елемента вузла, а не об'єкта даних :

ДЕМО

$('#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
Дані завантажуються в dom і там обробляються за допомогою .data (). Атрибут не оновлюється і не повинен використовуватися для зберігання або отримання даних, лише для початкового встановлення даних. Незважаючи на те, що це один із способів змінити атрибут ( .prop()є кращим), це не правильний спосіб використання даних.
Найджел Енджел

4
.prop()буде отримувати доступ або змінювати значення будь-якого властивості або атрибута в DOM, але не HTML. .attr()буде отримувати доступ та переписувати HTML, що робить його повільнішим, ніж .prop(). Ви не повинні використовувати .attr()замість цього .data(), не просто тому, що це повільніше, а тому, що це не так, як це повинно працювати. jsfiddle.net/eXA76/2
Найджел Енджел

1
Я думаю, що цю відповідь слід видалити, оскільки вона дає погану пораду щодо використання даних ().
Nigel Angel

2
Так, jQuery документує, як його слід використовувати! Дані api.jquery.com/data зберігаються у глобальній змінній при завантаженні документа. Посилання на нього через атрибут НЕ ПРАЦЮЄ, якщо інший розробник, плагін або сценарій правильно оновлює дані за допомогою .data(). Ігноруючи правильний метод та використовуючи атрибут, ви рухаєтесь до свідомо викликаючих проблем.
Nigel Angel

4
@NigelAngel Хоча я ціную вашу думку з цього приводу, дані не завжди є найкращим варіантом для використання. Що робити, якщо вам потрібно оновити значення атрибута даних і відобразити його в домі, а також фактично змінити базове значення, яке потім використовується 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.
Lalit Kumar Maurya

Щиро дякуємо за останню пораду "Вам потрібно встановити його, як
показано

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

Сподіваюся, це допомагає.


6

В основному, існує два способи встановити / оновити значення атрибута даних, залежно від ваших потреб. Різниця полягає просто в тому, де збережені дані,

Якщо ви використовуєте, .data()він буде збережений у локальній змінній, що викликається data_user, і його не буде видно під час перевірки елемента. Якщо ви використовуєте, .attr()це буде загальнодоступним.

Набагато чіткіше пояснення цього коментаря


2

Ця відповідь призначена для тих, хто прагне просто змінити значення атрибута даних

Запропоноване не змінить значення вашого Jquery data-attr правильно, як заявив @adeneo. Хоча з якихось причин я не бачу його (чи будь-якого іншого), що публікує правильний метод для тих, хто прагне оновити свої дані. Відповідь, яку опублікував @Lucas Willems, може бути відповіддю на проблему Брайана Томпсетта - 汤 莱恩, але це не відповідь на запит, який може залучати сюди інших користувачів.

Швидка відповідь щодо оригінальної заяви про запит

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

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

Легкі помилки * - на початку атрибута, для якого ви хочете змінити значення, повинні бути "data-".


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

});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.