Как получить объект из data атрибута?

257
25 января 2018, 20:58

Почему когда вывожу первый раз console.log();, атрибут возвращает строку, а не объект? А если установить через JS данный атрибут, то возвращает уже объект?
Как изначально получить объект?

var data = JSON.parse( $('.js-block-obj').data('info') ); 
$('.js-block-obj').on('click', function() { 
  console.log( data); 
 
$( ".js-block-obj" ).data( "info", { b: 100, s: 0 } ); 
 
console.log( data ); 
})
.block { 
  height: 100px; 
  width: 100px; 
  margin: 2rem auto 0; 
  border: 2px solid #eaeaea; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="block js-block-obj" data-info="{&quot;b&quot;: 10, &quot;s&quot;: 1}"></div>

JSON.parse не работает, выдает ошибку:

Unexpected token b in JSON at position 2

Answer 1

Если в атрибуте валидный JSON, то jQuery сам возвратит Вам объект

jQuery(function($) { 
  var data = $('.js-block-obj').data('info'); 
  $('.js-block-obj').on('click', function() { 
    console.log(data); 
 
    $(".js-block-obj").data("info", { 
      b: 100, 
      s: 0 
    }); 
 
    console.log(data); 
  }); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<button class="block js-block-obj" data-info='{&quot;b&quot;: 10, &quot;s&quot;: 1}'>Click</button>

Answer 2
  1. Никак. data-атрибуты могут содержать только строки.
  2. Если нужно сохранять объект, то его надо сериализовать в строку.
    Например, перед сохранением делать JSON.stringify, а после чтения JSON.parse.
  3. Получить строку можно через elem.dataset.attrName для data-attr-name="...".
  4. Если браузер старый, то вместо dataset'а надо использовать getAttribute.
  5. Если есть jQuery, то функцией data можно сохранять что угодно.
  6. Dom-элементу можно как и любому другому объекту приделать собственные свойства, не связанные с атрибутами.
READ ALSO
Безопасность куки

Безопасность куки

Объясните пожалуйста почему куки считают не безопасными? Я думаю что это вполне себе безопасная вещь, я просто хочу убедится в этомКуки по подсунутой...

254
Как получить attr img через native js?

Как получить attr img через native js?

Привет есть такой код

196
Как изменить адресную строку в браузере? [требует правки]

Как изменить адресную строку в браузере? [требует правки]

создал сайт а не могу понять как изменить адресную строку

179
VK API, wall.get, поле created_by

VK API, wall.get, поле created_by

Через openapi контакта запрашиваю список постов конкретного сообществаВ ответ получаю массив объектов, но почему-то не во всех объектах есть...

237