Acara pengubahan ukuran jendela lintas browser - JavaScript / jQuery

240

Apa metode (modern) yang benar untuk memanfaatkan peristiwa mengubah ukuran jendela yang berfungsi di Firefox, WebKit , dan Internet Explorer?

Dan bisakah Anda menghidupkan / mematikan kedua scrollbar?

BuddyJoe
sumber
Saya juga melihat ini. Saya ingin mencoba menerapkan solusi yang ditawarkan di sini, tetapi saya khawatir saya tidak mengerti sintaks: $ (window). Apakah itu sesuatu yang khusus untuk jquery?
Byff
1
Byff, ya, $ (window) adalah konstruk jQuery. window.onresize adalah setara dengan JavaScript mentah.
Andrew Hedges
Demo ini dapat membantu siapa saja untuk menguji di semua browser jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe
window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/…
Dylan Valade
Pada Opera di ponsel dipicu setiap kali bilah atas (UI browser) ditampilkan / disembunyikan.
psur

Jawaban:

367

jQuery memiliki metode bawaan untuk ini:

$(window).resize(function () { /* do something */ });

Demi responsif UI, Anda dapat mempertimbangkan menggunakan setTimeout untuk memanggil kode Anda hanya setelah beberapa milidetik, seperti yang ditunjukkan dalam contoh berikut, terinspirasi oleh ini :

function doSomething() {
    alert("I'm done resizing for the moment");
};

var resizeTimer;
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(doSomething, 100);
});
Andrew Hedges
sumber
34
Mengapa acara ini tidak dipecat ketika jendela diperluas ke layar penuh dengan tombol?
Sly
2
@Sly Bagi saya itu berfungsi, di Safari, Chrome dan Mozilla di Mac. Browser mana yang Anda gunakan?
Mark Vital
2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Zack Zatkin-Gold
6
Elia, ini adalah JavaScript. Apa yang Anda tulis tidak benar (kecuali untuk satu kasus khusus ketika Anda membangun dengan yang baru).
Yoh Suzuki
3
Perlu disebutkan bahwa fungsi jQuery ini "menambahkan" panggilan fungsi ke daftar fungsi saat ini yang harus dipanggil pada ukuran jendela. Itu tidak menimpa peristiwa yang ada yang saat ini dijadwalkan pada ukuran jendela.
RTF
48
$(window).bind('resize', function () { 

    alert('resize');

});
fts
sumber
4
Saya lebih suka pendekatan bind, karena metode resize () sebenarnya adalah jalan pintas untuk pendekatan bind penuh, dan saya sering menemukan bahwa biasanya ada lebih dari satu event handler yang harus saya terapkan pada elemen.
Mike Kormendy
@ Mike - Tidak hanya itu, tapi saya kira metode mengubah ukuran tidak memiliki metode "unbind" jika Anda ingin menghapus pendengar. "Bind" jelas merupakan cara untuk pergi!
Shane
43

Berikut ini cara non-jQuery dalam memanfaatkan acara pengubahan ukuran:

window.addEventListener('resize', function(event){
  // do stuff here
});

Ini bekerja di semua browser modern. Itu tidak mencekik apa pun untuk Anda. Ini adalah contoh dari tindakan itu.

Jondlm
sumber
solusi ini tidak akan berfungsi di IE. Versi tetap dengan dukungan IE dom: stackoverflow.com/questions/6927637/…
Sergey
1
> Itu tidak mencekik apa pun untuk Anda. Bisakah Anda jelaskan? Apa yang harus / akan dicekiknya? Apakah ini berhubungan dengan peristiwa menembak berkali-kali berturut-turut?
josinalvo
@josinalvo pada umumnya ketika Anda sedang mendengarkan suatu acara yang membuat Anda ingin melakukan debounce (misalnya lodash) sehingga Anda tidak menyebabkan kemacetan dalam program Anda.
Jondlm
17

Maaf untuk membuka utas lama, tetapi jika seseorang tidak ingin menggunakan jQuery Anda dapat menggunakan ini:

function foo(){....};
window.onresize=foo;
javascript adalah masa depan
sumber
8
Perlu diketahui bahwa ini akan mengalahkan semua penangan yang ada yang mungkin terikat ke window.onresize. Jika skrip Anda harus menjalani ekosistem dengan skrip lain, Anda tidak boleh menganggap skrip Anda adalah satu-satunya yang ingin melakukan sesuatu pada ukuran jendela. Jika Anda tidak dapat menggunakan kerangka kerja seperti jQuery, Anda setidaknya harus mempertimbangkan meraih jendela yang ada. Mengubah ukuran, dan menambahkan handler Anda di akhir, daripada benar-benar mengacaukannya.
Tom Auger
2
@ TomAuger "Anda setidaknya harus mempertimbangkan meraih jendela yang ada. Mengeset, dan menambahkan pawang Anda ke ujungnya" - Anda mungkin bermaksud sebaliknya, yaitu "untuk memanggil pawang yang ada di akhir pawang Anda"? Saya benar-benar ingin melihat kode javascript yang akan menambahkan sesuatu ke akhir fungsi yang sudah ada :-)
TMS
Saya mengerti maksud Anda, dalam arti - penangan onResize baru Anda perlu membungkus onResize yang ada. Namun, itu tidak harus memanggil fungsi yang ingin Anda tambahkan ke onResize sampai setelah itu memanggil penangan onResize asli. Jadi Anda masih dapat memastikan fungsi onResize baru Anda dijalankan setelah fungsi onResize asli, yang mungkin lebih baik daripada kebalikannya.
Tom Auger
8

Karena Anda terbuka untuk jQuery, plugin ini tampaknya melakukan triknya.

Paolo Bergantino
sumber
5

Menggunakan jQuery 1.9.1 Saya baru tahu bahwa, meskipun secara teknis identik) *, ini tidak berfungsi di IE10 (tetapi di Firefox):

// did not work in IE10
$(function() {
    $(window).resize(CmsContent.adjustSize);
});

sementara ini berfungsi di kedua browser:

// did work in IE10
$(function() {
    $(window).bind('resize', function() {
        CmsContent.adjustSize();
    };
});

Sunting :)
* Sebenarnya tidak identik secara teknis, seperti dicatat dan dijelaskan dalam komentar oleh WraithKenny dan Henry Blyth .

bassim
sumber
1
Ada dua perubahan. Yang mana yang memiliki efek? ( .resize()ke .bind('resize')atau menambahkan fungsi anonim? Saya pikir ini yang kedua.)
WraithKenny
@WraithKenny Poin bagus. Mungkin sekali menambahkan fungsi anonim itulah yang membuatnya bekerja. Saya tidak ingat jika saya mencobanya.
bassim
1
Dalam kasus pertama, adjustSizemetode kehilangan konteksnya this, sedangkan panggilan kedua CmsContent.adjustSize()mempertahankan this, yaitu this === CmsContent. Jika CmsContentinstance diperlukan dalam adjustSizemetode, maka case pertama akan gagal. Kasing kedua akan berfungsi untuk setiap jenis panggilan fungsi, jadi disarankan untuk selalu melewati fungsi anonim.
Henry Blyth
1
@HenryBlyth Terima kasih! +1
bassim
4

jQuerymenyediakan $(window).resize()fungsi secara default:

<script type="text/javascript">
// function for resize of div/span elements
var $window = $( window ),
    $rightPanelData = $( '.rightPanelData' )
    $leftPanelData = $( '.leftPanelData' );

//jQuery window resize call/event
$window.resize(function resizeScreen() {
    // console.log('window is resizing');

    // here I am resizing my div class height
    $rightPanelData.css( 'height', $window.height() - 166 );
    $leftPanelData.css ( 'height', $window.height() - 236 );
});
</script> 
Aditya P Bhatt
sumber
3

Saya menganggap plugin jQuery "jQuery resize event" menjadi solusi terbaik untuk ini karena ini menangani pelambatan acara sehingga berfungsi sama di semua browser. Ini mirip dengan jawaban Andrews tetapi lebih baik karena Anda dapat mengaitkan acara pengubahan ukuran ke elemen / penyeleksi tertentu serta seluruh jendela. Ini membuka kemungkinan baru untuk menulis kode bersih.

Plugin ini tersedia di sini

Ada masalah kinerja jika Anda menambah banyak pendengar, tetapi untuk sebagian besar kasus penggunaan itu sempurna.

penyihir tua
sumber
0

Saya pikir Anda harus menambahkan kontrol lebih lanjut untuk ini:

    var disableRes = false;
    var refreshWindow = function() {
        disableRes = false;
        location.reload();
    }
    var resizeTimer;
    if (disableRes == false) {
        jQuery(window).resize(function() {
            disableRes = true;
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(refreshWindow, 1000);
        });
    }
Francesco Frapporti
sumber
0

berharap ini akan membantu di jQuery

tentukan suatu fungsi terlebih dahulu, jika ada fungsi yang ada lompati ke langkah berikutnya.

 function someFun() {
 //use your code
 }

ukuran browser gunakan seperti ini.

 $(window).on('resize', function () {
    someFun();  //call your function.
 });
Venu immadi
sumber
0

Selain fungsi mengubah ukuran jendela yang disebutkan, penting untuk dipahami bahwa acara pengubahan ukuran sering diaktifkan jika digunakan tanpa merusak acara.

Paul Irish memiliki fungsi yang sangat baik yang banyak mengubah ukuran panggilan. Sangat disarankan untuk digunakan. Bekerja lintas-browser. Mengujinya di IE8 tempo hari dan semuanya baik-baik saja.

http://www.paulirish.com/2009/throttled-smartresize-jquery-event-handler/

Pastikan untuk memeriksa demo untuk melihat perbedaannya.

Inilah fungsi untuk kelengkapan.

(function($,sr){

  // debouncing function from John Hann
  // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
  var debounce = function (func, threshold, execAsap) {
      var timeout;

      return function debounced () {
          var obj = this, args = arguments;
          function delayed () {
              if (!execAsap)
                  func.apply(obj, args);
              timeout = null;
          };

          if (timeout)
              clearTimeout(timeout);
          else if (execAsap)
              func.apply(obj, args);

          timeout = setTimeout(delayed, threshold || 100);
      };
  }
  // smartresize 
  jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };

})(jQuery,'smartresize');


// usage:
$(window).smartresize(function(){
  // code that takes it easy...
});
teknik rendah
sumber