Digamos que eu tenha 4 elementos div com class .navlink
, que, quando clicados, usam .data()
para definir uma chave chamada 'selected'
, para um valor de true
:
$('.navlink')click(function() { $(this).data('selected', true); })
Cada vez que um novo .navlink
é clicado, gostaria de armazenar o selecionado anteriormente navlink
para manipulação posterior. Existe uma maneira rápida e fácil de selecionar um elemento com base no que foi armazenado usando .data()
?
Não parece haver nenhum filtro jQuery : que se encaixe no perfil, e tentei o seguinte (dentro do mesmo evento de clique), mas por algum motivo não funcionou:
var $previous = $('.navlink').filter(
function() { $(this).data("selected") == true }
);
Eu sei que existem outras maneiras de fazer isso, mas agora estou curioso para saber se isso pode ser feito via .data()
.
$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Apenas para registro, você pode filtrar os dados com jquery (esta questão é bastante antiga, e o jQuery evoluiu desde então, então é certo escrever esta solução também):
ou melhor (para desempenho):
ou, se você deseja obter todos os elementos com
data-selected
set:Observe que este método só funcionará com dados que foram configurados por meio de atributos html. Se você definir ou alterar os dados com a
.data()
chamada, esse método não funcionará mais.fonte
.data()
método em vez de umdata-
atributo. Veja este violino: jsfiddle.net/bryandowning/tySWC - Além disso, o.find()
método procura por filhos do seletor anterior. No exemplo dado,data-selected
é um atributo de.navlink
, não um filho de.navlink
. Além disso,$('div p')
e$('div').find('p')
são essencialmente equivalentes. O uso.find()
parece ser mais lento devido à chamada de função extra (embora eu não tenha certeza sobre isso). Por favor, corrija-me se eu estiver errado sobre isso (eu realmente gostaria que esse método funcionasse)..data()
, uma vez que o jQuery pesquisa através do DOM, eu postei para aqueles (como eu) que chegaram a esta pergunta por outros motivos; 2) correto,.find()
busca nas crianças, então está errado neste exemplo; 3) Você está errado, eles não são equivalentes, como pesquisas jQuery da direita para a esquerda, ver jonraasch.com/blog/...$('[data-selected]')
me ajudou a algo como$('ul.categories a[data-categories_id]').click(......);
Podemos fazer um plugin com bastante facilidade:
Uso (marcando um botão de opção):
fonte
Observei duas coisas (podem ser erros de quando você escreveu).
$('.navlink').click
)return $(this).data("selected")==true
)fonte
Parece mais trabalho do que vale a pena.
1) Por que não ter apenas uma única variável JavaScript que armazena uma referência ao objeto elemento \ jQuery atualmente selecionado.
2) Por que não adicionar uma classe ao elemento atualmente selecionado. Então você pode consultar o DOM para a classe ".active" ou algo assim.
fonte