Учитывая произвольный элемент HTML с нулевым или большим количеством data-*
атрибутов, как можно получить список пар ключ-значение для данных.
Например, учитывая это:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
Я хотел бы иметь возможность программно получить это:
{ "id":10, "cat":"toy", "cid":42 }
Использование jQuery (v1.4.3), доступ к отдельным битам данных с использованием $.data()
простого, если ключи известны заранее, но не очевидно, как это можно сделать с произвольными наборами данных.
Я ищу «простое» решение jQuery, если оно существует, но в противном случае не возражает против подхода более низкого уровня. Я попытался разобрать$('#prod').attributes
но отсутствие javascript-фу подводит меня.
Обновить
CustomData делает то, что мне нужно. Тем не менее, включение плагина jQuery только для небольшой части его функциональности показалось излишним.
Изучение исходного кода помогло мне исправить мой собственный код (и улучшил мой javascript-fu).
Вот решение, которое я придумал:
function getDataAttributes(node) {
var d = {},
re_dataAttr = /^data\-(.+)$/;
$.each(node.get(0).attributes, function(index, attr) {
if (re_dataAttr.test(attr.nodeName)) {
var key = attr.nodeName.match(re_dataAttr)[1];
d[key] = attr.nodeValue;
}
});
return d;
}
обновление 2
Как показано в принятом ответе, решение тривиально с jQuery (> = 1.4.4). $('#prod').data()
вернет требуемые данные dict.
источник
Ответы:
На самом деле, если вы работаете с JQuery, начиная с версии
1.4.31.4.4 (из-за ошибки, упомянутой в комментариях ниже),data-*
атрибуты поддерживаются посредством.data()
:jQuery.fn.data
Функция возвращает всеdata-
атрибута внутри объекта в виде пар ключ-значение, причем ключ является частью имени атрибута после того, какdata-
и значение является значением этого атрибута после преобразования в соответствии с правилами , изложенными выше.Я также создал простую демонстрацию, если это не убедит вас: http://jsfiddle.net/yijiang/WVfSg/
источник
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). У меня в атрибуте были серийные номера продуктов, такие какdata-serial="00071134"
jQuery, превращенный в номер71134
, что заставило меня вернуться к менее элегантному.attr('data-serial')
(в вашем случае это не вариант). Я видел вопросы о SO, которые озвучили аналогичные разочарования по поводу.data()
, постараюсь выкопать один ...$.data()
также возвращает все, что вы сохранили, используя$.data(key, value)
. Если вы действительно хотите проверить, действительно ли что-то хранится в разметке как атрибут data- *, этот метод может оказаться не лучшим выбором.Также должно быть предложено чистое решение JavaScript, поскольку решение не сложное:
Это дает массив объектов атрибутов, которые имеют
name
иvalue
свойства:Редактировать: чтобы продвинуться дальше, вы можете получить словарь, перебирая атрибуты и заполняя объект данных:
Затем вы можете получить доступ к значению, например,
data-my-value="2"
какdata.myValue
;jsfiddle.net/3KFYf/33
Изменить: Если вы хотите установить атрибуты данных для вашего элемента программно из объекта, вы можете:
jsfiddle.net/3KFYf/34
РЕДАКТИРОВАТЬ: Если вы используете babel или TypeScript или кодируете только для браузеров es6, это хорошее место, чтобы использовать функции стрелок es6 и немного сократить код:
источник
-
символ, как jQuery, но отредактированный ответ делает.JSON.stringify()
встроенное форматирование JSON.el.getAttribute("data-foo")
. Я обновил свой ответ, чтобы показать, как вы можете установить атрибуты данных на основе объекта.Посмотрите здесь :
Если браузер также поддерживает HTML5 JavaScript API, вы сможете получить данные с помощью:
или
О, но я также читаю:
Это с мая 2010 года.
Если вы все равно используете jQuery, возможно, вы захотите взглянуть на плагин customdata . У меня нет опыта с этим, хотя.
источник
$("#my").customdata()
должно дать вам{method: "delete", remote: "true"}
... так что это должно работать.Как уже упоминалось выше, современные браузеры имеют API HTMLElement.dataset .
Этот API предоставляет вам DOMStringMap , и вы можете получить список
data-*
атрибутов, просто выполнив:Вы также можете получить массив с
data-
именами ключей свойства, таких какили сопоставьте его значения
и, как это, вы можете итерировать их и использовать их без необходимости фильтрации между всеми атрибутами элемента, как мы должны были сделать раньше .
источник
или конвертируйте
gilly3
отличный ответ в метод jQuery:Использование
$('.foo').info()
:;источник
Вы должны получить данные через атрибуты набора данных
набор данных является полезным инструментом для получения атрибута данных
источник
this.dataset
пока не работает на всех браузерах. Однако есть плагин jquery, который предоставляет эту функцию.Вы можете просто перебрать атрибуты данных, как и любой другой объект, чтобы получить ключи и значения, вот как это сделать
$.each
:источник
Я использую каждый вложенный - для меня это самое простое решение (Легко контролировать / изменять "то, что вы делаете со значениями - в моем примере выводите атрибуты данных как
ul-list
) (Jquery Code)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
источник
Один из способов найти все атрибуты данных - использовать
element.attributes
. Используя.attributes
, вы можете перебрать все атрибуты элемента, отфильтровывая элементы, которые включают строку «data-».источник