Bagaimana saya bisa menghubungkan ke acara pengubahan ukuran jendela browser?
Ada cara jQuery untuk mendengarkan acara ukuran tetapi saya lebih suka untuk tidak membawanya ke proyek saya hanya untuk persyaratan yang satu ini.
javascript
dom-events
window-resize
Akun mati
sumber
sumber
Jawaban:
jQuery hanya membungkus
resize
acara DOM standar , misalnya.jQuery dapat melakukan beberapa pekerjaan untuk memastikan bahwa acara pengubahan ukuran dipecat secara konsisten di semua browser, tapi saya tidak yakin apakah ada browser yang berbeda, tetapi saya mendorong Anda untuk menguji di Firefox, Safari, dan IE.
sumber
window.addEventListener('resize', function(){}, true);
window.onresize = () => { /* code */ };
atau lebih baik:window.addEventListener('resize', () => { /* code */ });
Pertama, saya tahu
addEventListener
metode ini telah disebutkan dalam komentar di atas, tetapi saya tidak melihat kode apa pun. Karena ini pendekatan yang disukai, ini dia:Ini sampel yang berfungsi .
sumber
removeEventListener
.Jangan pernah menimpa fungsi window.onresize.
Sebaliknya, buat fungsi untuk menambahkan Event Listener ke objek atau elemen. Ini memeriksa dan memetikan pendengar tidak bekerja, maka mengesampingkan fungsi objek sebagai upaya terakhir. Ini adalah metode yang disukai yang digunakan di perpustakaan seperti jQuery.
object
: elemen atau objek jendelatype
: ubah ukuran, gulir (jenis peristiwa)callback
: referensi fungsiMaka gunakan seperti ini:
atau dengan fungsi anonim:
sumber
attachEvent
tidak lagi didukung. Cara yang disukai untuk masa depan adalahaddEventListener
.elem == undefined
. Mungkin (walaupun tidak mungkin) bahwa "tidak terdefinisi" didefinisikan secara lokal sebagai sesuatu yang lain. stackoverflow.com/questions/8175673/…Acara pengubahan ukuran tidak boleh digunakan secara langsung karena dipecat secara terus-menerus sebagaimana kita mengubah ukuran.
Gunakan fungsi debounce untuk mengurangi kelebihan panggilan.
window.addEventListener('resize',debounce(handler, delay, immediate),false);
Berikut ini adalah debounce umum yang melayang di sekitar net, meskipun mencari yang lebih maju sebagai featuerd di lodash.
Ini dapat digunakan seperti ...
Itu tidak akan pernah menembak lebih dari sekali setiap 200 ms.
Untuk perubahan orientasi seluler gunakan:
Ini perpustakaan kecil yang saya kumpulkan untuk merawatnya dengan rapi.
sumber
(...arguments) => {...}
(atau...args
untuk lebih sedikit kebingungan) karenaarguments
variabel tidak lagi tersedia cakupannya.Solusi untuk 2018+:
Anda harus menggunakan ResizeObserver . Ini adalah solusi browser-asli yang memiliki kinerja yang jauh lebih baik daripada menggunakan
resize
acara tersebut. Selain itu, tidak hanya mendukung acara didocument
tetapi juga sewenang-wenangelements
.Saat ini, Firefox, Chrome, dan Safari mendukungnya . Untuk peramban lain (dan yang lebih lama), Anda harus menggunakan polyfill .
sumber
Saya percaya bahwa jawaban yang benar telah disediakan oleh @Alex V, namun jawabannya memang memerlukan beberapa modernisasi karena sudah lebih dari lima tahun sekarang.
Ada dua masalah utama:
Jangan pernah gunakan
object
sebagai nama parameter. Itu adalah kata yang dipulihkan. Dengan demikian, fungsi yang disediakan @Alex V tidak akan berfungsistrict mode
.The
addEvent
fungsi yang disediakan oleh @ Alex V tidak mengembalikanevent object
jikaaddEventListener
metode yang digunakan. Parameter lain harus ditambahkan keaddEvent
fungsi untuk memungkinkan ini.CATATAN: Parameter baru
addEvent
telah dibuat opsional sehingga migrasi ke versi fungsi baru ini tidak akan memutuskan panggilan sebelumnya ke fungsi ini. Semua penggunaan lawas akan didukung.Berikut adalah
addEvent
fungsi yang diperbarui dengan perubahan ini:Contoh panggilan ke
addEvent
fungsi baru :sumber
Terima kasih telah merujuk posting blog saya di http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html .
Meskipun Anda hanya dapat terhubung ke acara pengubahan ukuran jendela standar, Anda akan menemukan bahwa di IE, acara tersebut dipecat satu kali untuk setiap X dan sekali untuk setiap gerakan sumbu Y, menghasilkan satu ton peristiwa yang dipecat yang mungkin memiliki kinerja berdampak pada situs Anda jika rendering adalah tugas yang intensif.
Metode saya melibatkan batas waktu singkat yang dibatalkan pada acara berikutnya sehingga acara tersebut tidak menggelembung ke kode Anda sampai pengguna selesai mengubah ukuran jendela.
sumber
sumber
Posting blog berikut ini mungkin berguna bagi Anda: Memperbaiki acara mengubah ukuran jendela di IE
Ini menyediakan kode ini:
sumber
Solusi yang disebutkan di atas akan bekerja jika semua yang Anda ingin lakukan hanya mengubah ukuran jendela dan jendela saja. Namun, jika Anda ingin agar ukurannya disebarkan ke elemen anak, Anda harus menyebarkan acara itu sendiri. Berikut beberapa contoh kode untuk melakukannya:
Perhatikan bahwa elemen anak dapat memanggil
pada objek acara yang dilewatkan sebagai Arg pertama dari ukuran peristiwa. Sebagai contoh:
sumber
sumber
sumber