É possível criar um ouvinte de evento no jQuery que possa ser vinculado a qualquer alteração de estilo? Por exemplo, se eu quiser "fazer" algo quando um elemento alterar dimensões, ou qualquer outra alteração no atributo style, eu poderia fazer:
$('div').bind('style', function() {
console.log($(this).css('height'));
});
$('div').height(100); // yields '100'
Seria realmente útil.
Alguma ideia?
ATUALIZAR
Desculpe por responder isso sozinho, mas escrevi uma solução interessante que pode se encaixar em outra pessoa:
(function() {
var ev = new $.Event('style'),
orig = $.fn.css;
$.fn.css = function() {
$(this).trigger(ev);
return orig.apply(this, arguments);
}
})();
Isso substituirá temporariamente o método prototype.css interno e o redefinirá com um gatilho no final. Então funciona assim:
$('p').bind('style', function(e) {
console.log( $(this).attr('style') );
});
$('p').width(100);
$('p').css('color','red');
javascript
jquery
David Hellsing
fonte
fonte
Respostas:
Como o jQuery é de código aberto, acho que você poderia ajustar a
css
função para chamar uma função de sua escolha toda vez que ela for chamada (passando o objeto jQuery). Obviamente, você desejará vasculhar o código jQuery para garantir que não haja mais nada que ele use internamente para definir propriedades CSS. Idealmente, você gostaria de escrever um plugin separado para o jQuery, para que não interfira na própria biblioteca do jQuery, mas você terá que decidir se isso é ou não possível para o seu projeto.fonte
As coisas mudaram um pouco desde que a pergunta foi feita - agora é possível usar um MutationObserver para detectar alterações no atributo 'style' de um elemento, não é necessário jQuery:
O argumento que é passado para a função de retorno de chamada é um objeto MutationRecord que permite obter os valores de estilo antigo e novo.
O suporte é bom em navegadores modernos, incluindo o IE 11+.
fonte
@media
alteração de classe .getComputedStyle
comsetInterval
isso, mas isso atrasaria muito o seu site.HTMLElement.style.prop = "value"
A declaração do seu objeto de evento deve estar dentro da sua nova função css. Caso contrário, o evento poderá ser acionado apenas uma vez.
fonte
Eu acho que a melhor resposta é do Mike, caso você não consiga iniciar o seu evento porque não é do seu código. Mas eu recebo alguns erros quando o usei. Então, escrevo uma nova resposta para mostrar o código que eu uso.
Extensão
Uso
Eu recebi um erro porque var ev = new $ .Event ('style'); Algo como estilo não foi definido no HtmlDiv. Eu o removi e inicio agora $ (this) .trigger ("stylechanged"). Outro problema foi que Mike não retornou o resultado de $ (css, ..) e pode causar problemas em alguns casos. Então eu pego o resultado e o devolvo. Agora funciona ^^ Em todas as alterações no CSS, incluo algumas bibliotecas que não consigo modificar e acionar um evento.
fonte
Como outros sugeriram, se você tiver controle sobre qualquer código que esteja alterando o estilo do elemento, poderá disparar um evento personalizado ao alterar a altura do elemento:
Caso contrário, embora consuma muitos recursos, você pode definir um cronômetro para verificar periodicamente se há alterações na altura do elemento ...
fonte
Não há suporte embutido para o evento de mudança de estilo no jQuery ou no script java. Mas o jQuery oferece suporte para criar eventos personalizados e ouvi-los, mas toda vez que houver uma alteração, você deve ter uma maneira de acioná-lo. Portanto, não será uma solução completa.
fonte
você pode experimentar o plugin Jquery, ele aciona eventos quando o css é alterado e é fácil de usar
fonte
Pergunta interessante. O problema é que height () não aceita um retorno de chamada, portanto você não poderá acioná-lo. Use animate () ou css () para definir a altura e, em seguida, acionar o evento personalizado no retorno de chamada. Aqui está um exemplo usando animate (), testado e funciona ( demo ), como uma prova de conceito:
fonte
trigger()
o evento manualmente. Eu acho que o OP está após algum evento acionado automaticamente quando um atributo de estilo é modificado.Apenas adicionando e formalizando a solução do @David acima:
Observe que as funções jQuery são encadeadas e retornam 'this' para que várias invocações possam ser chamadas uma após a outra (por exemplo
$container.css("overflow", "hidden").css("outline", 0);
).Portanto, o código aprimorado deve ser:
fonte
E o jQuery cssHooks?
Talvez eu não entenda a pergunta, mas o que você está procurando é fácil
cssHooks
, sem alterar acss()
função.copiar da documentação:
https://api.jquery.com/jQuery.cssHooks/
fonte
Eu tinha o mesmo problema, então escrevi isso. Funciona bastante bem. Parece ótimo se você o misturar com algumas transições CSS.
fonte