Détection d'événement lorsque la propriété css a changé à l'aide de Jquery

91

Existe-t-il un moyen de détecter si la propriété css "afficher" d'un élément est modifiée (en absence ou en bloc ou en bloc en ligne ...)? sinon, un plugin? Merci

HP.
la source

Réponses:

93

Remarque

Les événements de mutation sont obsolètes depuis la rédaction de cet article et peuvent ne pas être pris en charge par tous les navigateurs. Utilisez plutôt un observateur de mutation .

Oui, vous pouvez. Le module Evénements DOM L2 définit les événements de mutation ; l'un d'entre eux - DOMAttrModified est celui dont vous avez besoin. Certes, ceux-ci ne sont pas largement mis en œuvre, mais sont pris en charge au moins dans les navigateurs Gecko et Opera.

Essayez quelque chose du genre:

document.documentElement.addEventListener('DOMAttrModified', function(e){
  if (e.attrName === 'style') {
    console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
  }
}, false);

document.documentElement.style.display = 'block';

Vous pouvez également essayer d'utiliser l'événement "propertychange" d'IE en remplacement de DOMAttrModified. Il doit permettre de détecter les stylechangements de manière fiable.

Kangax
la source
Merci. Sera-t-il compatible avec Firefox?
HP.
7
@Boldewyn: True, mais changer l' classattribut (ou tout autre attribut si des sélecteurs d'attribut sont présents dans le CSS) d'un ancêtre de l'élément pourrait également changer l'élément, vous devrez donc gérer tous les DOMAttrModifiedévénements de l'élément racine du document en assurez-vous de tout attraper.
Tim Down
12
Cet événement est obsolète dans w3c. Cela doit être une autre façon.
ccsakuweb
8
Les événements de mutation ont été marqués comme obsolètes dans la spécification des événements DOM, car la conception de l'API est défectueuse. Les observateurs de mutation sont le remplaçant proposé. Voici le lien [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf
1
Anmol - le lien MDN pour les événements de mutation doit être: developer.mozilla.org/en-US/docs/Web/Guide/Events/…
groovecoder
19

Vous pouvez utiliser le plugin attrchange jQuery . La fonction principale du plugin est de lier une fonction d'écoute lors du changement d'attribut des éléments HTML.

Exemple de code:

$("#myDiv").attrchange({
    trackValues: true, // set to true so that the event object is updated with old & new values
    callback: function(evnt) {
        if(evnt.attributeName == "display") { // which attribute you want to watch for changes
            if(evnt.newValue.search(/inline/i) == -1) {

                // your code to execute goes here...
            }
        }
    }
});
Muhammad Reda
la source
Notez que pour certains plugins qui modifient CSS, evnt.attributeName est «style» et non «display».
jerrygarciuh
Fonctionne bien mais c'est plus rapide que d'utiliser la recherche regex et vous n'avez pas besoin du premier if (evnt.attributeName ...): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. ..; retour;}
Dan Randolph
4

Vous pouvez utiliser la cssfonction de jQuery pour tester les propriétés CSS, par exemple. if ($('node').css('display') == 'block').

Colin a raison, qu'il n'y a pas d'événement explicite qui est déclenché lorsqu'une propriété CSS spécifique est modifiée. Mais vous pourrez peut-être le retourner et déclencher un événement qui définit l'affichage, etc.

Pensez également à ajouter des classes CSS pour obtenir le comportement souhaité. Souvent, vous pouvez ajouter une classe à un élément conteneur et utiliser CSS pour affecter tous les éléments. Je gifle souvent une classe sur l'élément body pour indiquer qu'une réponse AJAX est en attente. Ensuite, je peux utiliser des sélecteurs CSS pour obtenir l'affichage que je veux.

Je ne sais pas si c'est ce que vous recherchez.

ndp
la source
3

Pour les propriétés sur lesquelles la transition css affectera, vous pouvez utiliser l'événement transitionend, par exemple pour z-index:

$(".observed-element").on("webkitTransitionEnd transitionend", function(e) {
  console.log("end", e);
  alert("z-index changed");
});

$(".changeButton").on("click", function() {
  console.log("click");
  document.querySelector(".observed-element").style.zIndex = (Math.random() * 1000) | 0;
});
.observed-element {
  transition: z-index 1ms;
  -webkit-transition: z-index 1ms;
}
div {
  width: 100px;
  height: 100px;
  border: 1px solid;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="changeButton">change z-index</button>
<div class="observed-element"></div>

IgorL
la source
-17

Vous ne pouvez pas. CSS ne prend pas en charge les «événements». Oserais-je vous demander pourquoi vous en avez besoin? Consultez cet article ici sur SO. Je ne peux pas penser à une raison pour laquelle vous voudriez relier un événement à un changement de style. Je suppose ici que le changement de style est déclenché ailleurs par un morceau de javascript. Pourquoi ne pas y ajouter une logique supplémentaire?

Colin
la source
1
J'ai plusieurs événements qui peuvent déclencher l'apparition ou non d'une boîte. Et j'ai un autre élément qui dépend un peu de l'apparence de cette boîte pour faire les choses. Maintenant, je ne veux pas répéter le code et me connecter à tous les autres événements apparaissant à la boîte, bien que ce soit une façon de le faire. Juste une redondance!
HP.
C'est redondant, peut-être que l'utilisation d'un système basé sur des règles fonctionnerait? c'est-à-dire, une structure de type JSON qui définit ce qui devrait arriver à un contrôle lorsqu'un autre contrôle change? de cette façon, vous n'auriez besoin que de créer 1 fonction qui utilise l'objet de règle et peut-être le contrôle actuel (id) comme paramètre?
Colin
3
Pourquoi ce vote est-il défavorable? La définition de la classe pour le parent des deux éléments et le changement de style est la seule bonne solution pour cela.
Ilia G
11
Évalué pour "Je ne vois pas de raison pour laquelle vous voudriez associer un événement à un changement de style" - si vous ne pouvez pas penser à une raison, cela ne signifie pas qu'il n'y a pas de raison possible, et pour "Pourquoi pas ajouter de logique supplémentaire là-bas? " - parce que vous ne pouvez pas toujours modifier les scripts.
Andrei Cojea
Pour donner un exemple, je souhaite modifier la propriété fill d'un chemin svg lorsque la propriété color de l'élément parent change.
Andrei Cojea