Dado um elemento HTML arbitrário com zero ou mais data-*
atributos, como recuperar uma lista de pares de valores-chave para os dados.
Por exemplo, dado o seguinte:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
Eu gostaria de poder recuperar programaticamente isso:
{ "id":10, "cat":"toy", "cid":42 }
Usando o jQuery (v1.4.3), acessar os bits individuais de dados usando $.data()
é simples se as chaves forem conhecidas antecipadamente, mas não é óbvio como alguém pode fazer isso com conjuntos arbitrários de dados.
Estou procurando uma solução jQuery 'simples', se houver, mas não se importaria com uma abordagem de nível inferior. Eu tentei analisar, $('#prod').attributes
mas minha falta de javascript-fu está me decepcionando.
atualizar
customdata faz o que eu preciso. No entanto, incluir um plugin jQuery apenas por uma fração de sua funcionalidade parecia um exagero.
Observar a fonte me ajudou a corrigir meu próprio código (e melhorou meu javascript-fu).
Aqui está a solução que eu vim com:
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;
}
atualização 2
Como demonstrado na resposta aceita, a solução é trivial com o jQuery (> = 1.4.4). $('#prod').data()
retornaria o ditado de dados necessário.
fonte
Respostas:
Na verdade, se você estiver trabalhando com jQuery, a partir da versão
1.4.31.4.4 (devido ao erro mencionado nos comentários abaixo), osdata-*
atributos são suportados por.data()
:A
jQuery.fn.data
função retornará todo odata-
atributo dentro de um objeto como pares de valor-chave, sendo a chave a parte do nome do atributodata-
e o valor o valor desse atributo após a conversão, seguindo as regras mencionadas acima.Também criei uma demonstração simples, se isso não o convencer: http://jsfiddle.net/yijiang/WVfSg/
fonte
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). Eu tinha números de série do produto em meu atributo, comodata-serial="00071134"
qual jQuery se transformou em um número71134
, forçando-me a voltar ao menos elegante.attr('data-serial')
(não é uma opção no seu caso). Eu já vi perguntas sobre SO que expressaram frustrações semelhantes.data()
, tentarão desenterrar uma delas ...$.data()
também retorna tudo o que você armazenou usando$.data(key, value)
. Se você realmente deseja verificar se algo está realmente armazenado na marcação como um atributo data- *, esse método pode não ser a melhor opção.Uma solução JavaScript pura também deve ser oferecida, pois a solução não é difícil:
Isso fornece uma matriz de objetos de atributo, que possuem
name
evalue
propriedades:Editar: para dar um passo adiante, você pode obter um dicionário iterando os atributos e preenchendo um objeto de dados:
Você pode acessar o valor de, por exemplo,
data-my-value="2"
comodata.myValue
;jsfiddle.net/3KFYf/33
Editar: se você deseja definir atributos de dados em seu elemento programaticamente a partir de um objeto, você pode:
jsfiddle.net/3KFYf/34
EDIT: Se você estiver usando babel ou TypeScript, ou codificando apenas para navegadores es6, este é um bom lugar para usar as funções de seta es6 e diminuir um pouco o código:
fonte
-
caractere como o jQuery, mas a resposta editada.JSON.stringify()
tem JSON formatação construído dentro.el.getAttribute("data-foo")
. Atualizei minha resposta para mostrar como você pode definir atributos de dados com base em um objeto.Dê uma olhada aqui :
Se o navegador também suportar a API JavaScript HTML5, você poderá obter os dados com:
ou
Ah, mas eu também li:
É a partir de maio de 2010.
Se você usar o jQuery de qualquer maneira, poderá dar uma olhada no plug- in customdata . Eu não tenho experiência com isso, no entanto.
fonte
$("#my").customdata()
deve lhe dar{method: "delete", remote: "true"}
... então deve funcionar.Conforme mencionado acima, os navegadores modernos têm a API The HTMLElement.dataset .
Essa API fornece um DOMStringMap e você pode recuperar a lista de
data-*
atributos simplesmente fazendo:você também pode recuperar uma matriz com os
data-
nomes das chaves da propriedade, comoou mapeie seus valores por
e assim você pode iterá-los e usá-los sem a necessidade de filtrar todos os atributos do elemento, como precisávamos fazer antes .
fonte
ou converta
gilly3
a excelente resposta de um método jQuery:Usando
$('.foo').info()
:;fonte
Você deve obter os dados através dos atributos do conjunto de dados
conjunto de dados é uma ferramenta útil para obter atributo de dados
fonte
this.dataset
ainda não funciona em todos os navegadores. No entanto, existe um plugin jquery que fornece esse recurso.Você pode simplesmente iterar sobre os atributos de dados, como qualquer outro objeto, para obter chaves e valores. Veja como fazer isso
$.each
:fonte
Eu uso aninhado cada um - para mim, essa é a solução mais fácil (fácil de controlar / alterar "o que você faz com os valores - no meu exemplo, output data-attribute as
ul-list
) (Jquery Code)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
fonte
Uma maneira de encontrar todos os atributos de dados é usando
element.attributes
. Usando.attributes
, você pode percorrer todos os atributos do elemento, filtrando os itens que incluem a string "data-".fonte