Qual é a diferença de uso entre $.data
e $.attr
ao usar data-someAttribute
?
Meu entendimento é que $.data
é armazenado no jQuery $.cache
, não no DOM. Portanto, se eu quiser usar $.cache
para armazenamento de dados, devo usar $.data
. Se eu quiser adicionar atributos de dados HTML5, devo usar $.attr("data-attribute", "myCoolValue")
.
attr()
pode levar a vazamentos de memória (pelo menos no IE), enquanto o usodata()
é seguro. Ele sugere isso em sua resposta, embora ele não explique explicitamente. Mais informações sobre os documentos do jQuery (consulte as "Notas adicionais"): api.jquery.com/attrdata-someAttribute
é inválido; de acordo com as especificações, somente letras minúsculas são permitidas. Você encontrará uma infinidade de problemas estranhos usando caracteres maiúsculos.Respostas:
Se você estiver passando dados para um elemento DOM do servidor, defina os dados no elemento:
Os dados podem ser acessados usando
.data()
no jQuery:No entanto, quando você armazena dados em um nó DOM no jQuery usando dados, as variáveis são armazenadas no objeto do nó . Isso serve para acomodar objetos e referências complexos, pois o armazenamento dos dados no elemento do nó como um atributo acomodará apenas valores de sequência.
Continuando meu exemplo acima:Além disso, a convenção de nomenclatura para atributos de dados tem um pouco de "pegadinha" oculto:
HTML: JS:A chave hifenizada ainda funcionará:
HTML: JS:No entanto, o objeto retornado por
.data()
não terá a chave hifenizada definida:É por esse motivo que sugiro evitar a chave hifenizada em javascript.
Para HTML, continue usando o formulário hifenizado. Atributos HTML é suposto a obter automaticamente em minúsculas-ASCII , então
<div data-foobar></div>
,<DIV DATA-FOOBAR></DIV>
e<dIv DaTa-FoObAr></DiV>
são suposto ser tratados como idênticos, mas para a melhor compatibilidade deve ser preferido a forma minúsculas.O
HTML: JS:.data()
método também executará alguma conversão automática básica se o valor corresponder a um padrão reconhecido:Essa capacidade de transmissão automática é muito conveniente para instanciar widgets e plugins:
Se você absolutamente precisa ter o valor original como uma string, precisará usar
HTML: JS:.attr()
:Este foi um exemplo artificial. Para armazenar valores de cores, eu costumava usar a notação hexadecimal numérica (ou seja, 0xABC123), mas vale a pena notar que o hex foi analisado incorretamente nas versões do jQuery anteriores à 1.7.2 e não é mais analisado no a
Number
partir do jQuery 1.8 rc 1.O jQuery 1.8 rc 1 mudou o comportamento da conversão automática . Antes, qualquer formato que fosse uma representação válida de a
HTML: JS:Number
seria convertido emNumber
. Agora, os valores numéricos só são convertidos automaticamente se sua representação permanecer a mesma. Isso é melhor ilustrado com um exemplo.Se você planeja usar sintaxe numérica alternativa para acessar valores numéricos, certifique-se de converter o valor em um
JS (cont.):Number
primeiro, como em um+
operador unário .fonte
.data()
se não ter o hífen conjunto de formulários, por isso$('#bar').data('foo-bar-baz')
vai funcionar, mas$('#bar').data()['foo-bar-baz']
não vai. É por esse motivo que sugiro que as pessoas evitem usar o formulário hifenizado.A principal diferença entre os dois é onde está armazenado e como é acessado.
$.fn.attr
armazena as informações diretamente no elemento em atributos que são publicamente visíveis após a inspeção e também estão disponíveis na API nativa do elemento.$.fn.data
armazena as informações em um local ridiculamente obscuro . Ele está localizado em uma variável local fechada sobre chamada,data_user
que é uma instância de uma função definida localmente Data. Esta variável não é acessível diretamente de fora do jQuery.Conjunto de dados com
attr()
$(element).attr('data-name')
element.getAttribute('data-name')
,data-name
também acessível a partir de$(element).data(name)
eelement.dataset['name']
eelement.dataset.name
Conjunto de dados com
.data()
.data(name)
.attr()
ou em qualquer outro lugarfonte
.attr()
é o caminho a percorrer, se depois você quiser usar a dados como seletor (.data()
não será encontrada; veja codepen.io/anon/pen/EvawPV?editors=1011 )Você pode usar o
data-*
atributo para incorporar dados personalizados. Osdata-*
atributos nos permitem incorporar atributos de dados personalizados em todos os elementos HTML.O
.data()
método jQuery permite que você obtenha / defina dados de qualquer tipo para elementos DOM de uma maneira segura de referências circulares e, portanto, de vazamentos de memória.O
.attr()
método jQuery obtém / define o valor do atributo apenas para o primeiro elemento no conjunto correspondente.Exemplo:
fonte