Apakah mungkin membuat pendengar acara di jQuery yang dapat terikat pada perubahan gaya apa pun? Misalnya, jika saya ingin "melakukan" sesuatu ketika suatu elemen mengubah dimensi, atau perubahan lain dalam atribut style yang dapat saya lakukan:
$('div').bind('style', function() {
console.log($(this).css('height'));
});
$('div').height(100); // yields '100'
Ini akan sangat berguna.
Ada ide?
MEMPERBARUI
Maaf telah menjawab ini sendiri, tetapi saya menulis solusi yang rapi yang mungkin cocok untuk orang lain:
(function() {
var ev = new $.Event('style'),
orig = $.fn.css;
$.fn.css = function() {
$(this).trigger(ev);
return orig.apply(this, arguments);
}
})();
Ini sementara akan menimpa metode prototipe.css internal dan mendefinisikan kembali dengan pemicu di akhir. Jadi kerjanya seperti ini:
$('p').bind('style', function(e) {
console.log( $(this).attr('style') );
});
$('p').width(100);
$('p').css('color','red');
javascript
jquery
David Hellsing
sumber
sumber
Jawaban:
Karena jQuery adalah open-source, saya kira Anda dapat mengubah
css
fungsi untuk memanggil fungsi pilihan Anda setiap kali dipanggil (melewati objek jQuery). Tentu saja, Anda ingin menjelajahi kode jQuery untuk memastikan tidak ada lagi yang digunakan secara internal untuk mengatur properti CSS. Idealnya, Anda ingin menulis plugin terpisah untuk jQuery sehingga tidak mengganggu perpustakaan jQuery itu sendiri, tetapi Anda harus memutuskan apakah layak atau tidak untuk proyek Anda.sumber
Hal-hal telah berubah sedikit sejak pertanyaan diajukan - sekarang mungkin untuk menggunakan MutationObserver untuk mendeteksi perubahan dalam atribut 'style' elemen, tidak diperlukan jQuery:
Argumen yang diteruskan ke fungsi panggilan balik adalah objek MutationRecord yang memungkinkan Anda mendapatkan nilai gaya lama dan baru.
Dukungan bagus di peramban modern termasuk IE 11+.
sumber
@media
perubahan.getComputedStyle
dengansetInterval
tetapi itu akan banyak memperlambat situs web Anda.HTMLElement.style.prop = "value"
Deklarasi objek acara Anda harus berada di dalam fungsi css baru Anda. Kalau tidak, acara hanya bisa dipecat sekali.
sumber
Saya pikir jawaban terbaik jika dari Mike jika Anda tidak dapat meluncurkan acara Anda karena bukan dari kode Anda. Tapi saya mendapatkan beberapa kesalahan saat menggunakannya. Jadi saya menulis jawaban baru untuk menunjukkan kepada Anda kode yang saya gunakan.
Perpanjangan
Pemakaian
Saya mendapat kesalahan karena var ev = new $ .Event ('style'); Sesuatu seperti style tidak didefinisikan dalam HtmlDiv .. Saya menghapusnya, dan saya memulai sekarang $ (ini) .trigger ("stylechanged"). Masalah lain adalah bahwa Mike tidak mengembalikan resulto $ (css, ..) maka dapat membuat masalah dalam beberapa kasus. Jadi saya mendapatkan hasilnya dan mengembalikannya. Sekarang berfungsi ^^ Dalam setiap perubahan css, sertakan dari beberapa lib yang tidak dapat saya modifikasi dan picu suatu peristiwa.
sumber
Seperti yang disarankan orang lain, jika Anda memiliki kendali atas kode apa pun yang mengubah gaya elemen, Anda dapat memecat acara khusus ketika Anda mengubah tinggi elemen:
Jika tidak, meskipun cukup menghabiskan banyak sumber daya, Anda dapat mengatur timer untuk memeriksa perubahan ketinggian elemen secara berkala ...
sumber
Tidak ada dukungan bawaan untuk acara perubahan gaya di jQuery atau dalam skrip java. Tetapi jQuery mendukung untuk membuat acara khusus dan mendengarkannya, tetapi setiap kali ada perubahan, Anda harus memiliki cara untuk memicunya sendiri. Jadi itu tidak akan menjadi solusi yang lengkap.
sumber
Anda dapat mencoba plugin Jquery, itu memicu peristiwa ketika css berubah dan mudah digunakan
sumber
Pertanyaan menarik. Masalahnya adalah ketinggian () tidak menerima panggilan balik, jadi Anda tidak akan dapat mengaktifkan panggilan balik. Gunakan baik animate () atau css () untuk mengatur ketinggian dan kemudian memicu acara khusus di callback. Berikut adalah contoh menggunakan animate (), diuji dan bekerja ( demo ), sebagai bukti konsep:
sumber
trigger()
acara secara manual. Saya akan berpikir OP adalah setelah beberapa peristiwa yang dipicu otomatis ketika atribut style diubah.Hanya menambah dan memformalkan solusi @David dari atas:
Perhatikan bahwa fungsi jQuery dapat diputus-putus dan mengembalikan 'ini' sehingga beberapa pemanggilan dapat dipanggil satu demi satu (mis.
$container.css("overflow", "hidden").css("outline", 0);
).Jadi kode yang ditingkatkan harus:
sumber
Bagaimana dengan jQuery cssHooks?
Mungkin saya tidak mengerti pertanyaannya, tetapi apa yang Anda cari mudah dilakukan
cssHooks
, tanpa mengubahcss()
fungsi.salin dari dokumentasi:
https://api.jquery.com/jQuery.cssHooks/
sumber
Saya memiliki masalah yang sama, jadi saya menulis ini. Ini bekerja dengan baik. Tampak hebat jika Anda mencampurnya dengan beberapa transisi CSS.
sumber