Peristiwa mendeteksi ketika properti css berubah menggunakan Jquery

91

Adakah cara untuk mendeteksi jika properti css "display" dari suatu elemen diubah (menjadi tidak ada atau blok atau blok-sebaris ...)? jika tidak, plugin apa saja? Terima kasih

HP.
sumber

Jawaban:

93

Catatan

Peristiwa mutasi sudah tidak berlaku lagi sejak postingan ini ditulis, dan mungkin tidak didukung oleh semua browser. Sebagai gantinya, gunakan pengamat mutasi .

Ya kamu bisa. Modul DOM L2 Events mendefinisikan kejadian mutasi ; salah satunya - DOMAttrModified adalah yang Anda butuhkan. Memang, ini tidak diterapkan secara luas, tetapi didukung setidaknya di browser Gecko dan Opera.

Cobalah sesuatu seperti ini:

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

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

Anda juga dapat mencoba memanfaatkan peristiwa "propertychange" IE sebagai pengganti DOMAttrModified. Ini harus memungkinkan untuk mendeteksi styleperubahan dengan andal.

kangax
sumber
Terima kasih. Apakah itu mendukung Firefox?
HP.
7
@Boldewyn: Benar, tetapi mengubah classatribut (atau atribut lain jika penyeleksi atribut ada di CSS) dari leluhur elemen juga dapat mengubah elemen, jadi Anda harus menangani semua DOMAttrModifiedkejadian pada elemen akar dokumen untuk pastikan menangkap semuanya.
Tim Down
12
Acara itu tidak digunakan lagi di w3c. Ini pasti cara lain.
ccsakuweb
8
Peristiwa mutasi telah ditandai sebagai tidak berlaku lagi dalam spesifikasi Peristiwa DOM, karena desain API yang cacat. Pengamat Mutasi adalah pengganti yang diusulkan. Ini tautannya [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf
1
Anmol - tautan MDN untuk acara Mutasi harus: developer.mozilla.org/en-US/docs/Web/Guide/Events/…
groovecoder
19

Anda dapat menggunakan plugin jQuery attrchange . Fungsi utama plugin adalah untuk mengikat fungsi listener pada perubahan atribut elemen HTML.

Contoh kode:

$("#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
sumber
Perhatikan bahwa untuk beberapa plugin yang memodifikasi CSS evnt.attributeName adalah 'style' bukan 'display'.
jerrygarciuh
Bekerja dengan baik tetapi ini lebih cepat daripada menggunakan pencarian regex dan Anda tidak membutuhkan if (evnt.attributeName ...): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. ..; kembali;}
Dan Randolph
4

Anda dapat menggunakan cssfungsi jQuery untuk menguji properti CSS, misalnya. if ($('node').css('display') == 'block').

Colin benar, bahwa tidak ada peristiwa eksplisit yang diaktifkan saat properti CSS tertentu diubah. Tapi Anda mungkin bisa membalikkannya, dan memicu peristiwa yang mengatur tampilan, dan apa pun.

Pertimbangkan juga untuk menggunakan menambahkan kelas CSS untuk mendapatkan perilaku yang Anda inginkan. Seringkali Anda dapat menambahkan kelas ke elemen penampung, dan menggunakan CSS untuk memengaruhi semua elemen. Saya sering menampar kelas ke elemen tubuh untuk menunjukkan bahwa respons AJAX tertunda. Kemudian saya dapat menggunakan pemilih CSS untuk mendapatkan tampilan yang saya inginkan.

Tidak yakin apakah ini yang Anda cari.

ndp
sumber
3

Untuk properti yang akan terpengaruh oleh transisi css, dapat menggunakan peristiwa transisi akhir, contoh untuk 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
sumber
-17

Tidak boleh. CSS tidak mendukung "acara". Berani saya bertanya untuk apa Anda membutuhkannya? Lihat posting ini di sini di SO. Saya tidak dapat memikirkan alasan mengapa Anda ingin mengaitkan acara dengan perubahan gaya. Saya berasumsi di sini bahwa perubahan gaya dipicu di tempat lain oleh javascript. Mengapa tidak menambahkan logika ekstra di sana?

Colin
sumber
1
Saya memiliki beberapa kejadian yang dapat memicu munculnya sebuah kotak atau tidak. Dan saya memiliki elemen lain yang agak bergantung pada tampilan kotak itu untuk melakukan sesuatu. Sekarang, saya tidak ingin mengulangi kode dan menghubungkan ke semua acara lain yang muncul di kotak meskipun itu adalah salah satu cara untuk melakukannya. Hanya redundansi!
HP.
Itu berlebihan, mungkin menggunakan sistem berbasis aturan akan berhasil? yaitu, beberapa struktur seperti JSON yang mendefinisikan apa yang harus terjadi pada beberapa kontrol ketika kontrol lain berubah? dengan cara ini Anda hanya perlu membuat 1 fungsi yang menggunakan objek aturan dan mungkin kontrol saat ini (id) sebagai parameter?
Colin
3
Mengapa ini tidak disukai? Mendefinisikan kelas untuk induk dari kedua elemen dan mengubah gaya padanya adalah satu-satunya solusi yang tepat untuk ini.
Ilia G
11
Dinilai negatif untuk "Saya tidak bisa memikirkan alasan mengapa Anda ingin mengaitkan acara dengan perubahan gaya" - jika Anda tidak dapat memikirkan alasannya, bukan berarti tidak ada alasan yang mungkin, dan untuk "Mengapa tidak menambahkan logika ekstra di sana? " - karena Anda tidak selalu dapat mengubah skrip.
Andrei Cojea
Untuk memberikan contoh, saya ingin mengubah properti isian dari jalur svg ketika properti warna dari elemen induk berubah.
Andrei Cojea