Ist es möglich, in jQuery einen Ereignis-Listener zu erstellen, der an Stiländerungen gebunden werden kann? Wenn ich beispielsweise etwas "tun" möchte, wenn ein Element die Abmessungen ändert, oder andere Änderungen am Stilattribut, könnte ich Folgendes tun:
$('div').bind('style', function() {
console.log($(this).css('height'));
});
$('div').height(100); // yields '100'
Es wäre wirklich nützlich.
Irgendwelche Ideen?
AKTUALISIEREN
Es tut mir leid, dass ich das selbst beantwortet habe, aber ich habe eine nette Lösung geschrieben, die zu jemand anderem passen könnte:
(function() {
var ev = new $.Event('style'),
orig = $.fn.css;
$.fn.css = function() {
$(this).trigger(ev);
return orig.apply(this, arguments);
}
})();
Dadurch wird die interne prototype.css-Methode vorübergehend überschrieben und am Ende mit einem Trigger neu definiert. So funktioniert es:
$('p').bind('style', function(e) {
console.log( $(this).attr('style') );
});
$('p').width(100);
$('p').css('color','red');
javascript
jquery
David Hellsing
quelle
quelle
Antworten:
Da jQuery Open Source ist, würde ich vermuten, dass Sie die
css
Funktion optimieren können, um bei jedem Aufruf eine Funktion Ihrer Wahl aufzurufen (Übergabe des jQuery-Objekts). Natürlich sollten Sie den jQuery-Code durchsuchen, um sicherzustellen, dass intern nichts anderes zum Festlegen von CSS-Eigenschaften verwendet wird. Idealerweise möchten Sie ein separates Plugin für jQuery schreiben, damit es die jQuery-Bibliothek selbst nicht beeinträchtigt. Sie müssen jedoch entscheiden, ob dies für Ihr Projekt möglich ist oder nicht.quelle
Seit die Frage gestellt wurde, haben sich die Dinge etwas weiterentwickelt. Es ist jetzt möglich, einen MutationObserver zu verwenden, um Änderungen im 'style'-Attribut eines Elements zu erkennen, ohne dass jQuery erforderlich ist:
Das Argument, das an die Rückruffunktion übergeben wird, ist ein MutationRecord- Objekt, mit dem Sie die alten und neuen Stilwerte abrufen können.
Die Unterstützung ist in modernen Browsern einschließlich IE 11+ gut.
quelle
@media
-änderungen ändert.getComputedStyle
mit verwenden,setInterval
aber das würde Ihre Website sehr verlangsamen.HTMLElement.style.prop = "value"
Die Deklaration Ihres Ereignisobjekts muss sich in Ihrer neuen CSS-Funktion befinden. Andernfalls kann das Ereignis nur einmal ausgelöst werden.
quelle
Ich denke, die beste Antwort von Mike für den Fall, dass Sie Ihre Veranstaltung nicht starten können, weil sie nicht aus Ihrem Code stammt. Aber ich bekomme einige Fehler, wenn ich es benutzt habe. Also schreibe ich eine neue Antwort, um Ihnen den Code zu zeigen, den ich verwende.
Erweiterung
Verwendung
Ich habe eine Fehlermeldung erhalten, weil var ev = new $ .Event ('style'); So etwas wie Stil wurde in HtmlDiv nicht definiert. Ich habe ihn entfernt und starte jetzt $ (this) .trigger ("stylechanged"). Ein weiteres Problem war, dass Mike das Ergebnis von $ (css, ..) nicht zurückgegeben hat. In einigen Fällen kann es zu Problemen kommen. Also bekomme ich das Ergebnis und gebe es zurück. Jetzt funktioniert ^^ In jeder CSS-Änderung sind einige Bibliotheken enthalten, die ich nicht ändern und ein Ereignis auslösen kann.
quelle
Wie andere vorgeschlagen haben, können Sie ein benutzerdefiniertes Ereignis auslösen, wenn Sie die Kontrolle über den Code haben, der den Stil des Elements ändert: Wenn Sie die Höhe des Elements ändern:
Andernfalls können Sie, obwohl ziemlich ressourcenintensiv, einen Timer einstellen, der regelmäßig nach Änderungen an der Höhe des Elements sucht ...
quelle
Es gibt keine eingebaute Unterstützung für das Stiländerungsereignis in jQuery oder in Java Script. JQuery unterstützt jedoch das Erstellen und Abhören von benutzerdefinierten Ereignissen. Bei jeder Änderung sollten Sie jedoch die Möglichkeit haben, diese selbst auszulösen. Es wird also keine vollständige Lösung sein.
quelle
Sie können das Jquery-Plugin ausprobieren. Es löst Ereignisse aus, wenn CSS geändert wird, und es ist einfach zu verwenden
quelle
Interessante Frage. Das Problem ist, dass height () keinen Rückruf akzeptiert, sodass Sie keinen Rückruf starten können. Verwenden Sie entweder animate () oder css (), um die Höhe festzulegen, und lösen Sie dann das benutzerdefinierte Ereignis im Rückruf aus. Hier ist ein Beispiel mit animate (), getestet und funktioniert ( Demo ) als Proof of Concept:
quelle
trigger()
das Ereignis manuell. Ich würde denken, dass das OP nach einem automatisch ausgelösten Ereignis ist, wenn ein Stilattribut geändert wird.Fügen Sie einfach die @ David-Lösung von oben hinzu und formalisieren Sie sie:
Beachten Sie, dass jQuery-Funktionen verkettbar sind und 'this' zurückgeben, sodass mehrere Aufrufe nacheinander aufgerufen werden können (z
$container.css("overflow", "hidden").css("outline", 0);
. B. ).Der verbesserte Code sollte also sein:
quelle
Wie wäre es mit jQuery cssHooks?
Vielleicht verstehe ich die Frage nicht, aber was Sie suchen, ist leicht zu erledigen
cssHooks
, ohne diecss()
Funktion zu ändern .Kopie aus der Dokumentation:
https://api.jquery.com/jQuery.cssHooks/
quelle
Ich hatte das gleiche Problem, also habe ich das geschrieben. Es funktioniert ziemlich gut. Sieht gut aus, wenn Sie es mit einigen CSS-Übergängen mischen.
quelle