Como posso disparar um evento se uma classe CSS for adicionada ou alterada usando o jQuery? A alteração de uma classe CSS dispara o change()
evento jQuery ?
jquery
css
jquery-events
user237060
fonte
fonte
Respostas:
Sempre que você altera uma classe em seu script, você pode usar a
trigger
para criar seu próprio evento.mas, caso contrário, não, não há como preparar um evento quando uma classe muda.
change()
somente é acionado após o foco deixar uma entrada cuja entrada foi alterada.Mais informações sobre jQuery Triggers
fonte
changeColor
evento e todos os objetos que assinam esse evento podem reagir de acordo.IMHO, a melhor solução é combinar duas respostas de @ RamboNo5 e @Jason
Quero dizer, substituindo a função addClass e adicionando um evento personalizado chamado
cssClassChanged
fonte
$()
, quando a ação real é iniciada.cssClassChanged
evento a um elemento, deve estar ciente de que ele será acionado mesmo quando seu filho mudar de classe. Portanto, se, por exemplo, você não desejar acionar esse evento para eles, adicione algo como$("#YourExampleElementID *").on('cssClassChanged', function(e) { e.stopPropagation(); });
após a ligação. Enfim, solução muito boa, obrigado!Se você deseja detectar alterações de classe, a melhor maneira é usar os Observadores de Mutação, que oferecem controle total sobre qualquer alteração de atributo. No entanto, você mesmo precisa definir o ouvinte e anexá-lo ao elemento que está ouvindo. O bom é que você não precisa acionar nada manualmente depois que o ouvinte é anexado.
Neste exemplo, o ouvinte de evento é anexado a cada elemento, mas você não deseja isso na maioria dos casos (economize memória). Anexe esse ouvinte "attrchange" ao elemento que você deseja observar.
fonte
DOMMutationObserver
.Eu sugiro que você substitua a função addClass. Você pode fazer assim:
fonte
Apenas uma prova de conceito:
Veja a essência para ver algumas anotações e manter-se atualizado:
https://gist.github.com/yckart/c893d7db0f49b1ea4dfb
O uso é bastante simples, basta adicionar um novo listender no nó que você deseja observar e manipular as classes normalmente:
fonte
this[0]
é indefinido ... simplesmente substituir o final das linhas comvar oldClass
evar newClass
com a seguinte atribuição:= (this[0] ? this[0].className : "");
usando a mais recente mutação jquery
// qualquer código que atualiza div com a classe required-entry que está em $ target como $ target.addClass ('search-class');
fonte
change()
não é acionado quando uma classe CSS é adicionada ou removida ou a definição é alterada. É acionado em circunstâncias como quando um valor da caixa de seleção é selecionado ou desmarcado.Não tenho certeza se você quer dizer se a definição da classe CSS foi alterada (o que pode ser feito através de programação, mas é tedioso e geralmente não recomendado) ou se uma classe é adicionada ou removida a um elemento. Não há como capturar isso de maneira confiável nos dois casos.
Obviamente, você poderia criar seu próprio evento para isso, mas isso só pode ser descrito como um aviso . Ele não captura o código que não é seu.
Como alternativa, você pode substituir / substituir os
addClass()
métodos (etc) no jQuery, mas isso não será capturado quando for feito via Javascript de baunilha (embora eu ache que você também possa substituir esses métodos).fonte
Há mais uma maneira sem acionar um evento personalizado
Um plug-in jQuery para monitorar alterações de CSS de elemento HTML por Rick Strahl
Citando acima
fonte
Boa pergunta. Estou usando o menu suspenso Bootstrap e precisava executar um evento quando um menu suspenso do Bootstrap estava oculto. Quando o menu suspenso é aberto, a div que contém o nome de uma classe de "grupo de botões" adiciona uma classe de "aberto"; e o botão em si possui um atributo "ária-expandido" definido como true. Quando o menu suspenso é fechado, essa classe de "aberto" é removida da div que contém e a ária-expandida é alterada de verdadeiro para falso.
Isso me levou a essa pergunta, de como detectar a mudança de classe.
Com o Bootstrap, há "Eventos suspensos" que podem ser detectados. Procure por "Eventos suspensos" neste link. http://www.w3schools.com/bootstrap/bootstrap_ref_js_dropdown.asp
Aqui está um exemplo rápido e sujo de usar esse evento em um menu suspenso de inicialização.
Agora percebo que isso é mais específico do que a pergunta geral que está sendo feita. Mas imagino que outros desenvolvedores que tentam detectar um evento aberto ou fechado com um menu suspenso do Bootstrap achem isso útil. Como eu, eles podem inicialmente seguir o caminho de simplesmente tentar detectar uma alteração de classe de elemento (o que aparentemente não é tão simples). Obrigado.
fonte
Se você precisar disparar um evento específico, poderá substituir o método addClass () para disparar um evento personalizado chamado 'classadded'.
Aqui como:
fonte
Você pode vincular o evento DOMSubtreeModified. Eu adiciono um exemplo aqui:
HTML
Javascript
http://jsfiddle.net/hnCxK/13/
fonte
se você conhece um evento que mudou a classe em primeiro lugar, pode usar um pequeno atraso no mesmo evento e verificar a classe. exemplo
http://jsfiddle.net/GuDCp/3/
fonte
fonte