Jquery seleciona todos os elementos que possuem $ jquery.data ()


Respostas:


98

Você poderia fazer

$('[data-myAttr!=""]'); 

isso seleciona todos os elementos que têm um atributo data-myAttrque não é igual a '' (portanto, deve ter sido definido);

você também pode usar o filtro ()

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

67
Ou apenas:$('[data-myAttr]')
andlrc

4
Pensei a mesma coisa. Não funciona como esperado. veja esta DEMO
gdoron está apoiando Monica em

um fechamento 'está faltando na primeira parte do código (não é possível editar a resposta diretamente)
Florent2

1
$ ('[data-myAttr! = ""]'); retornará elementos que não o têm atribuído. O comentário de @NULL apenas obtém elementos que o tenham definido.
arleslie

6
ERRADO! solução correta: $ ('[data-myAttr]') - veja a resposta abaixo para explicação
BassMHL

74

A melhor e simples maneira de selecioná-los é:

$('[data-myAttr]')

Mais Informações:

Eu testei muitas coisas.

Usar $('[data-myAttr!=""]')não funciona para todos os casos. Porque os elementos que não possuem um data-myAttrconjunto, terão seus data-myAttriguais undefinede $('[data-myAttr!=""]')os selecionarão também, o que é incorreto.


3
Isso só funciona com atributos de dados definidos na marcação. Ele NÃO funciona com atributos de dados definidos via jQuery, consulte jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

Você pode usar o filtro () :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});

1
Estava prestes a postar isso, aqui está um violino para mostrar que funciona: jsfiddle.net/gbHFZ/1
Rory McCrossan

1
Por que o seletor de atributos não faz o trabalho? $('[data-myAttr]')?
gdoron está apoiando Monica em

6
@gdoron, isso ocorre porque data()o formulário getter de realmente lê os data-atributos HTML5 , mas seu formato setter não os cria nem os atualiza.
Frédéric Hamidi

ummm, então onde ele salva os dados? você pode me dar uma referência? Eu li isso "(todos os valores de dados são armazenados internamente no jQuery)." mas onde???
gdoron está apoiando Monica em

3
@gdoron, os dados são persistidos em um cache global, codificados por um id que é associado ao elemento por meio de uma propriedade expando.
Frédéric Hamidi


7

Você pode usar JQuery UI com o seletor: data ()

Seleciona elementos que possuem dados armazenados na chave especificada.

Verifique este jsfiddle para um exemplo

Para obter todos os elementos correspondentes, .data('myAttr')você pode usar

var matches = $(':data(myAttr)');

Isso deve funcionar para elementos com data-atributos e elementos com dados armazenados usando $.data()porque

A partir do jQuery 1.4.3 HTML 5, atributos de dados serão automaticamente puxados para o objeto de dados jQuery.

Mas isso não funciona muito bem. Verifique este jsfiddle e você verá que na segunda vez que o seletor é chamado, ele deve corresponder a 2 elementos e está correspondendo apenas a um. Isso se deve a "um bug" na biblioteca jquery-ui.

Isso é obtido do arquivo principal jquery-ui.

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

Como você pode ver que eles estão usando $.data(elem, match), em vez $(elem).data(match)que faz com que o cache não ser atualizado no caso de você está solicitando elementos com data-atributos. Se o elemento foi testado para data()armazenamento, isso funciona bem, mas se não, não será incluído nas correspondências resultantes.

Isso pode não ser um bug se o que você quer é combinar apenas os elementos com as informações de dados definidas por você, mas se não, você tem duas opções.

  1. Não use jquery-ui e estenda seu próprio pseudo-seletor $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });

  2. Use jquery-ui com o :datapseudoselector e junte os resultados da seleção [data-myAttr]para incluir aqueles que podem ser ignorados

    var matches = $(':data(myAttr)', '[data-myAttr]')


Isso foi parte da solução para meu problema de selecionar elementos com atributos data- * sem saber o id real ou o nome do atributo de dados. Eu encontrei a maneira de estender o jQuery para fazer isso, em outro lugar, mas 1 aqui para o trecho de código para mostrar a aplicação prática. Outros fornecem apenas o suficiente para dar uma dica, mas às vezes você precisa MOSTRAR como USAR as informações fornecidas. Obrigado! :)
Brandon Elliott

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

Selecione os elementos que defini anteriormente com jquery.data();


A questão é encontrar todos os elementos com uma chave específica e não quaisquer dados.


Tente utilizar jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


Obrigado pela resposta. A questão é encontrar todos os elementos com uma chave específica e não quaisquer dados.
Argiropoulos Stavros

@ArgiropoulosStavros É necessário retornar elementos que possuem html data-*conjunto de atributos, bem como jQuery.data()conjunto?
guest271314
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.