Ereigniserkennung, wenn sich die CSS-Eigenschaft mithilfe von Jquery geändert hat

91

Gibt es eine Möglichkeit zu erkennen, ob die CSS-Eigenschaft "display" eines Elements geändert wurde (ob keine oder ein Block oder ein Inline-Block ...)? wenn nicht, irgendein Plugin? Vielen Dank

HP.
quelle

Antworten:

93

Hinweis

Mutationsereignisse sind seit dem Schreiben dieses Beitrags veraltet und werden möglicherweise nicht von allen Browsern unterstützt. Verwenden Sie stattdessen einen Mutationsbeobachter .

Ja, du kannst. Das Modul DOM L2-Ereignisse definiert Mutationsereignisse . einer von ihnen - DOMAttrModified ist das, was Sie brauchen. Zugegeben, diese sind nicht weit verbreitet, werden aber zumindest in Gecko- und Opera-Browsern unterstützt.

Versuchen Sie etwas in diese Richtung:

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

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

Sie können auch versuchen, das IE-Ereignis "propertychange" als Ersatz für zu verwenden DOMAttrModified. Es sollte ermöglichen, styleÄnderungen zuverlässig zu erkennen .

Kangax
quelle
Vielen Dank. Wird es Firefox unterstützen?
HP.
7
@Boldewyn: Richtig, aber das Ändern des classAttributs (oder eines anderen Attributs, wenn Attributselektoren im CSS vorhanden sind) eines Vorfahren des Elements kann auch das Element ändern, sodass Sie alle DOMAttrModifiedEreignisse im Dokumentstammelement auf behandeln müssen Achten Sie darauf, alles zu fangen.
Tim Down
12
Dieses Ereignis ist in w3c veraltet. Es muss ein anderer Weg sein.
ccsakuweb
8
Die Mutationsereignisse wurden in der DOM-Ereignisspezifikation als veraltet markiert, da das Design der API fehlerhaft ist. Mutationsbeobachter sind der vorgeschlagene Ersatz. Hier ist der Link [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf
1
Anmol - der MDN-Link für Mutationsereignisse sollte lauten: developer.mozilla.org/en-US/docs/Web/Guide/Events/…
Groovecoder
19

Sie können das attrchange jQuery-Plugin verwenden . Die Hauptfunktion des Plugins besteht darin, eine Listener-Funktion bei Attributänderungen von HTML-Elementen zu binden.

Codebeispiel:

$("#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
quelle
Beachten Sie, dass für einige Plugins, die CSS ändern, evnt.attributeName 'style' und nicht 'display' ist.
Jerrygarciuh
Funktioniert gut, ist jedoch schneller als die Verwendung der Regex-Suche und Sie benötigen nicht das erste if (evnt.attributeName ...): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. ..; Rückkehr;}
Dan Randolph
4

Sie können die cssFunktion von jQuery verwenden, um die CSS-Eigenschaften zu testen, z. if ($('node').css('display') == 'block').

Colin hat Recht, dass es kein explizites Ereignis gibt, das ausgelöst wird, wenn eine bestimmte CSS-Eigenschaft geändert wird. Möglicherweise können Sie es jedoch umdrehen und ein Ereignis auslösen, das die Anzeige festlegt, und was auch immer.

Erwägen Sie auch das Hinzufügen von CSS-Klassen, um das gewünschte Verhalten zu erzielen. Oft können Sie einem enthaltenden Element eine Klasse hinzufügen und CSS verwenden, um alle Elemente zu beeinflussen. Ich schlage oft eine Klasse auf das body-Element, um anzuzeigen, dass eine AJAX-Antwort aussteht. Dann kann ich CSS-Selektoren verwenden, um die gewünschte Anzeige zu erhalten.

Ich bin mir nicht sicher, ob Sie danach suchen.

ndp
quelle
3

Verwenden Sie für Eigenschaften, für die sich der CSS-Übergang auswirkt, das Transitionend-Ereignis, z. B. für den 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
quelle
-17

Das kannst du nicht. CSS unterstützt keine "Ereignisse". Darf ich fragen, wofür du es brauchst? Schauen Sie sich diesen Beitrag hier auf SO an. Ich kann mir keinen Grund vorstellen, warum Sie ein Event mit einem Stilwechsel verbinden möchten. Ich gehe hier davon aus, dass der Stilwechsel irgendwo anders durch ein Stück Javascript ausgelöst wird. Warum nicht dort zusätzliche Logik hinzufügen?

Colin
quelle
1
Ich habe mehrere Ereignisse, die dazu führen können, dass eine Box angezeigt wird oder nicht. Und ich habe ein anderes Element, das irgendwie vom Aussehen dieser Box abhängt, um Dinge zu tun. Jetzt möchte ich den Code nicht wiederholen und mich mit allen anderen Ereignissen verbinden, die in der Box angezeigt werden, obwohl dies eine Möglichkeit ist, dies zu tun. Nur Redundanz!
HP.
Es ist redundant, vielleicht würde die Verwendung eines regelbasierten Systems funktionieren? dh eine JSON-ähnliche Struktur, die definiert, was mit einem Steuerelement geschehen soll, wenn sich ein anderes Steuerelement ändert? Auf diese Weise müssten Sie nur eine Funktion erstellen, die das Regelobjekt und möglicherweise das aktuelle Steuerelement (ID) als Parameter verwendet.
Colin
3
Warum wird das abgelehnt? Die Definition der Klasse für das übergeordnete Element beider Elemente und die Änderung des Stils ist die einzig richtige Lösung.
Ilia G
11
Abgestimmt für "Ich kann mir keinen Grund vorstellen, warum Sie ein Ereignis mit einem Stilwechsel verbinden möchten" - wenn Sie sich keinen Grund vorstellen können, bedeutet dies nicht, dass es keinen möglichen Grund gibt, und für "Warum Fügen Sie dort keine zusätzliche Logik hinzu? " - weil Sie die Skripte nicht immer ändern können.
Andrei Cojea
Als Beispiel möchte ich die Fülleigenschaft eines SVG-Pfads ändern, wenn sich die Farbeigenschaft des übergeordneten Elements ändert.
Andrei Cojea