Existe um método fácil e direto para selecionar elementos com base em suas data
atributos? Por exemplo, selecione todas as âncoras que possuam atributo de dados customerID
com o valor de 22
.
Eu hesito em usar rel
ou outros atributos para armazenar essas informações, mas acho muito mais difícil selecionar um elemento com base em quais dados são armazenados nele.
jquery
html
custom-data-attribute
Hazem Salama
fonte
fonte
$('*[data-customerID]')
Você pode usá-lo com, por exemplo$('*[data-customerID]').each( function() { ... });
Respostas:
Você deve poder omitir o
*
, mas, se bem me lembro, dependendo da versão do jQuery que você estiver usando, isso pode gerar resultados defeituosos.Observe que, para compatibilidade com a API Selectors (
document.querySelector{,all}
), as aspas ao redor do valor do atributo (22
) não podem ser omitidas nesse caso .Além disso, se você trabalha muito com atributos de dados em seus scripts jQuery, pode considerar o uso do plug-in de atributos de dados customizados HTML5 . Isso permite que você escreva um código ainda mais legível usando
.dataAttr('foo')
e resulta em um tamanho de arquivo menor após a minificação (comparado ao uso.attr('data-foo')
).fonte
.data()
mapeia paradata-*
atributos personalizados por padrão, tornando esse plug-in redundante. Ainda pode ser usado para versões mais antigas do jQuery. ”$('[data-customerID]')
.data()
), certo?Para pessoas que pesquisam no Google e desejam regras mais gerais sobre como selecionar com atributos de dados:
$("[data-test]")
selecionará qualquer elemento que possua apenas o atributo de dados (não importa o valor do atributo). Incluindo:$('[data-test~="foo"]')
selecionará qualquer elemento em que o atributo data contenha,foo
mas não precise ser exato, como:$('[data-test="the_exact_value"]')
selecionará qualquer elemento em que o valor exato do atributo de dados sejathe_exact_value
, por exemplo:mas não
fonte
~=
corresponde a palavras separadas por espaços em branco, enquanto*=
corresponde a qualquer substring.^
personagem?$('[data-test^=foo]')
, neste caso, você seleciona qualquer coisa que começa com foo, como<div data-test="foo_exact_value">
ou<div data-test="food">
, mas não<div data-test="seafoo">
O uso
$('[data-whatever="myvalue"]')
selecionará qualquer coisa com atributos html, mas no jQueries mais recente, parece que, se você usa$(...).data(...)
para anexar dados, ele usa algum navegador mágico e não afeta o html, portanto, não é descoberto.find
como indicado na resposta anterior .Verificar (testado com 1.7.2+) (também veja violino ): (atualizado para ser mais completo)
fonte
.filter
aqui$item.attr('data-id', 10);
Não vi uma resposta JavaScript sem o jQuery. Espero que ajude alguém.
Informações:
atributos de dados
.querySelectorAll ();
fonte
Para selecionar todas as âncoras com o atributo de dados
data-customerID==22
, inclua oa
limite do escopo da pesquisa apenas nesse tipo de elemento. Fazer pesquisas de atributos de dados em um loop grande ou em alta frequência quando houver muitos elementos na página pode causar problemas de desempenho.fonte
Exemplos JS nativos
Obter NodeList de elementos
html:
<div data-id="container"></div>
Obter o primeiro elemento
html:
<div id="container"></div>
Segmente uma coleção de nós que retorna um nodelist
html:
Obter elementos com base em vários valores de dados (OR)
html:
Obter elementos com base em valores de dados combinados (AND)
html:
Obter itens onde o valor começa com
fonte
via método Jquery filter ():
http://jsfiddle.net/9n4e1agn/1/
HTML:
JavaScript:
fonte
A construção assim:
$('[data-XXX=111]')
não está funcionando no Safari 8.0 .Se você definir o atributo de dados desta maneira:,
$('div').data('XXX', 111)
ele funcionará apenas se você definir o atributo de dados diretamente no DOM, assim:$('div').attr('data-XXX', 111)
.Eu acho que é porque a equipe do jQuery otimizou o coletor de lixo para evitar vazamentos de memória e operações pesadas na reconstrução do DOM em cada atributo de alteração de dados.
fonte
Para que isso funcione no Chrome, o valor não deve ter outro par de aspas.
Funciona apenas, por exemplo, assim:
fonte
$('[data-action=setStatus]').removeClass('disabled')
Às vezes, é desejável filtrar elementos com base no fato de eles terem itens de dados anexados a eles programaticamente (também conhecido como não através de atributos dom):
O acima funciona, mas não é muito legível. Uma abordagem melhor é usar um pseudo-seletor para testar esse tipo de coisa:
Agora podemos refatorar a declaração original para algo mais fluente e legível:
fonte
Apenas para completar todas as respostas com alguns recursos do 'padrão de vida' - Até agora (na era html5), é possível fazê-lo sem uma biblioteca de terceiros:
document.querySelector('[data-answer="42"],[type="submit"]')
document.querySelectorAll('[data-answer="42"],[type="submit"]')
[data-answer="42"],[type="submit"]
[data-answer]
ouinput[type]
fonte