Evento di ridimensionamento della finestra tra browser - JavaScript / jQuery


240

Qual è il metodo (moderno) corretto per toccare l'evento di ridimensionamento della finestra che funziona in Firefox, WebKit e Internet Explorer?

E puoi attivare / disattivare entrambe le barre di scorrimento?


Sto anche esaminando questo. Vorrei provare ad applicare le soluzioni offerte qui, ma temo di non capire la sintassi: $ (finestra). È qualcosa di specifico per jquery?
Byff,

1
Byff, sì, $ (finestra) è un costrutto jQuery. window.onresize è l'equivalente in JavaScript non elaborato.
Andrew Hedges,

Questa demo può aiutare chiunque a testare su tutti i browser jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/…
Dylan Valade,

Su Opera su dispositivo mobile viene attivato ogni volta che viene visualizzata / nascosta la barra superiore (interfaccia utente del browser).
psur

Risposte:


367

jQuery ha un metodo integrato per questo:

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

Per motivi di reattività dell'interfaccia utente, potresti prendere in considerazione l'utilizzo di setTimeout per chiamare il codice solo dopo un certo numero di millisecondi, come mostrato nell'esempio seguente, ispirato da questo :

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

var resizeTimer;
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(doSomething, 100);
});

34
Perché questo evento non viene generato quando la finestra viene espansa a schermo intero con il pulsante?
Sly

2
@Sly Per me funziona, in Safari, Chrome e Mozilla su Mac. Quale browser usi?
Mark Vital,

2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Zack Zatkin-Gold

6
Elia, questo è JavaScript. Quello che hai scritto non è corretto (tranne per un caso specifico quando stai costruendo con nuovo).
Yoh Suzuki,

3
Vale la pena ricordare che questa funzione jQuery "aggiunge" una chiamata di funzione all'elenco corrente di funzioni che dovrebbero essere chiamate su un ridimensionamento della finestra. Non sovrascrive gli eventi esistenti che sono attualmente programmati su un ridimensionamento della finestra.
RTF,

48
$(window).bind('resize', function () { 

    alert('resize');

});

4
Preferisco l'approccio bind, poiché il metodo resize () è in realtà una scorciatoia per l'approccio bind completo e spesso trovo che di solito ci sia più di un gestore di eventi che dovrei applicare a un elemento.
Mike Kormendy,

@Mike - Non solo, ma suppongo che il metodo di ridimensionamento non abbia un metodo "unbind" nel caso in cui desideri rimuovere il listener. "bind" è sicuramente la strada da percorrere!
Shane,

43

Ecco il modo non jQuery di toccare l'evento di ridimensionamento:

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

Funziona su tutti i browser moderni. Lo fa Non acceleratore nulla per te. Ecco un esempio in azione.


questa soluzione non funzionerebbe in IE. Versione fissa con supporto di IE dom: stackoverflow.com/questions/6927637/…
Sergey

1
> Non limita nulla per te. Potresti per favore elaborare? Cosa dovrebbe / dovrebbe strozzare? Si riferisce all'evento sparato più volte di seguito?
josinalvo,

@josinalvo in genere quando ascolti un evento che genera molti incendi , vorrai rimandarlo (ad es. lodash) in modo da non causare colli di bottiglia nel tuo programma.
Jondlm,

17

Mi dispiace per far apparire un vecchio thread, ma se qualcuno non vuole usare jQuery puoi usare questo:

function foo(){....};
window.onresize=foo;

8
Basta essere consapevoli del fatto che ciò ostruirà qualsiasi gestore esistente che potrebbe essere associato a window.onresize. Se il tuo script deve vivere un ecosistema con altri script, non dovresti supporre che il tuo script sia l'unico a voler fare qualcosa sul ridimensionamento della finestra. Se non riesci a utilizzare un framework come jQuery, dovresti almeno prendere in considerazione la finestra esistente. Ridimensionare e aggiungere il gestore alla fine di essa, piuttosto che bloccarlo completamente.
Tom Auger,

2
@TomAuger "dovresti almeno prendere in considerazione la finestra esistente. Ridimensionare e aggiungere il tuo gestore alla fine" - probabilmente intendevi il contrario, cioè "chiamare il gestore esistente alla fine del gestore"? Mi piacerebbe davvero vedere un codice javascript che aggiungerebbe qualcosa alla fine della funzione già esistente :-)
TMS

Vedo il tuo punto, in un certo senso: il tuo nuovo gestore onResize deve racchiudere l'attuale onResize. Tuttavia, non deve chiamare la funzione che si desidera aggiungere a onResize fino a quando non ha chiamato il gestore originale onResize. Quindi puoi ancora assicurarti che la tua nuova funzione onResize venga eseguita dopo la funzione originale onResize, che è probabilmente migliore del contrario.
Tom Auger,


5

Utilizzando jQuery 1.9.1 ho appena scoperto che, sebbene tecnicamente identico) *, questo non ha funzionato in IE10 (ma in Firefox):

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

mentre questo ha funzionato in entrambi i browser:

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

Modifica :)
* In realtà non tecnicamente identico, come notato e spiegato nei commenti di WraithKenny e Henry Blyth .


1
Ci sono due cambiamenti. Quale ha avuto l'effetto? ( .resize()A .bind('resize')? O l'aggiunta della funzione anonima che sto pensando è la seconda.)
WraithKenny

@WraithKenny Un buon punto. È molto probabile che l'aggiunta della funzione anonima sia ciò che l'ha fatto funzionare. Non ricordo se l'ho provato.
bassim,

1
Nel primo caso, il adjustSizemetodo perde il suo contesto di this, mentre la seconda chiamata CmsContent.adjustSize()preserva this, vale a dire this === CmsContent. Se l' CmsContentistanza è richiesta nel adjustSizemetodo, il primo caso fallirà. Il secondo caso funzionerà per ogni tipo di chiamata di funzione, quindi si consiglia di passare sempre una funzione anonima.
Henry Blyth,

1
@HenryBlyth Grazie! +1
bassim

4

jQueryfornisce la $(window).resize()funzione di 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> 

3

Considero il plug-in jQuery "jQuery resize event" come la migliore soluzione per questo in quanto si occupa di limitare l'evento in modo che funzioni allo stesso modo su tutti i browser. È simile alla risposta di Andrews, ma è meglio poiché puoi agganciare l'evento di ridimensionamento a elementi / selettori specifici e all'intera finestra. Apre nuove possibilità per scrivere codice pulito.

Il plugin è disponibile qui

Ci sono problemi di prestazioni se aggiungi molti ascoltatori, ma per la maggior parte dei casi di utilizzo è perfetto.


0

Penso che dovresti aggiungere ulteriore controllo a questo:

    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);
        });
    }

0

spero che possa essere d'aiuto in jQuery

definire prima una funzione, se esiste una funzione esistente saltare al passaggio successivo.

 function someFun() {
 //use your code
 }

il ridimensionamento del browser è simile a questi.

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

0

Oltre alle funzioni di ridimensionamento della finestra menzionate, è importante capire che gli eventi di ridimensionamento si attivano molto se usati senza deboucing degli eventi.

Paul Irish ha una funzione eccellente che rimanda molto le chiamate di ridimensionamento. Molto raccomandato da usare. Funziona su più browser. L'ho provato in IE8 l'altro giorno e tutto è andato bene.

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

Assicurati di dare un'occhiata alla demo per vedere la differenza.

Ecco la funzione per completezza.

(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...
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.