Come attivare l'evento di ridimensionamento della finestra in JavaScript?


327

Ho registrato un trigger sul ridimensionamento della finestra. Voglio sapere come posso attivare l'evento da chiamare. Ad esempio, quando nascondo un div, voglio che venga chiamata la mia funzione di trigger.

Ho scoperto che window.resizeTo()può attivare la funzione, ma c'è qualche altra soluzione?

Risposte:


382

Ove possibile, preferisco chiamare la funzione piuttosto che inviare un evento. Funziona bene se hai il controllo sul codice che vuoi eseguire, ma vedi sotto per i casi in cui non possiedi il codice.

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}

In questo esempio, è possibile chiamare la doALoadOfStufffunzione senza inviare un evento.

Nei tuoi browser moderni, puoi attivare l'evento usando:

window.dispatchEvent(new Event('resize'));

Questo non funziona in Internet Explorer, dove dovrai fare il longhand:

var resizeEvent = window.document.createEvent('UIEvents'); 
resizeEvent.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(resizeEvent);

jQuery ha il triggermetodo , che funziona in questo modo:

$(window).trigger('resize');

E ha l'avvertenza:

Sebbene .trigger () simuli l'attivazione di un evento, completo di un oggetto evento sintetizzato, non replica perfettamente un evento naturale.

Puoi anche simulare eventi su un elemento specifico ...

function simulateClick(id) {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

6
La tua funzione anonima non è necessaria. window.onresize = doALoadOfStuff; Inoltre, questo non risponde alla domanda, la risposta di pinouchon di seguito è la risposta corretta.
Dennis Plucinik,

42
Per Google r: dai un'occhiata alla risposta di @ avetisk.
Fabian Lauer,

1
È una buona idea disaccoppiare, ma nel mio caso non funziona. La semplice chiamata del metodo di ridimensionamento non funziona perché se il ridimensionamento della finestra non viene attivato, vari altri div / container non avranno l'altezza impostata.
PandaWood,

@PandaWood - nel mio caso il mio ultimo esempio è migliore.
Fenton,

Grazie @ user75525
Bondsmith il

676
window.dispatchEvent(new Event('resize'));

11
sembra funzionare con Chrome, FF, Safari, ma non: IE!
Davem M

14
jQuery triggernon attiva effettivamente l'evento "ridimensionamento" nativo. Attiva solo i listener di eventi che sono stati aggiunti usando jQuery. Nel mio caso, una libreria di terze parti stava ascoltando direttamente l'evento nativo "ridimensionamento" e questa è la soluzione che ha funzionato per me.
Chowey,

2
Ottima e semplice soluzione. Anche se, penso che dovresti aggiungere un po 'di codice per la compatibilità di IE (per quanto vedo, per IE, dobbiamo usare window.fireEvent)
Victor

35
questo non ha funzionato su tutti i dispositivi per me. ho dovuto attivare l'evento in questo modo: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('resize', true, false, window, 0); window.dispatchEvent (EVT);
Manfred,

19
Non riesce con "L'oggetto non supporta questa azione" nel mio IE11
pomber

156

Con jQuery, puoi provare a chiamare trigger :

$(window).trigger('resize');

3
Un caso d'uso per questo è quando un plug-in jQuery utilizza gli eventi di ridimensionamento della finestra per rispondere, ma hai una barra laterale collassata. Il contenitore del plug-in viene ridimensionato, ma la finestra no.
Isherwood,

4
In realtà non c'è bisogno di JQuery ma preferisco la soluzione JQuery poiché il mio prodotto utilizza ampiamente JQuery.
Sri

Dove verrebbe aggiunto per ridimensionare una pagina di wordpress dopo che è stata caricata?
SAHM,

Questo non funziona per me in ultima Chrome, questa risposta fa: stackoverflow.com/a/22638332/1296209
webaholik

1
questo è quello che ho provato inizialmente - non ha funzionato, ma window.dispatchEvent(new Event('resize'));ha funzionato
user2682863

54

Un JS puro che funziona anche su IE (dal commento di @Manfred )

var evt = window.document.createEvent('UIEvents'); 
evt.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(evt);

O per angolare:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});

4
Sfortunatamente la documentazione per UIEvent.initUIEvent () dice che Do not use this method anymore as it is deprecated.i documenti createEvent dicono "Molti metodi usati con createEvent, come initCustomEvent, sono deprecati. Usa invece i costruttori di eventi ." Questa pagina sembra promettente per gli eventi dell'interfaccia utente.
Racing Tadpole,

9
Vero, ma IE11 non supporta il new Event()metodo. Penso che come un trucco contro i browser più vecchi potresti fare qualcosa del genere if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Dove il metodo corrente è la risposta dell'avetisk .
BrianS,

@pomber Grazie per la soluzione, in realtà stavo cercando di attivare un evento personalizzato per il ridimensionamento della finestra per ridimensionare il mio grafico ... la tua soluzione mi ha salvato la giornata
Dinesh Gopal Chand

49

Combinare le risposte di pomber e avetisk per coprire tutti i browser e non causare avvisi:

if (typeof(Event) === 'function') {
  // modern browsers
  window.dispatchEvent(new Event('resize'));
} else {
  // for IE and other old browsers
  // causes deprecation warning on modern browsers
  var evt = window.document.createEvent('UIEvents'); 
  evt.initUIEvent('resize', true, false, window, 0); 
  window.dispatchEvent(evt);
}

1
Questo è un buon modo per farlo attraverso i browser senza usare jQuery.
kgx,

non ho idea del perché questa non sia la risposta migliore ...... è meglio delle risposte "o o" accettate ....
SPillai,

14

In realtà non sono riuscito a farlo funzionare con nessuna delle soluzioni sopra. Una volta associato l'evento con jQuery, ha funzionato bene come di seguito:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');

Funziona in Chrome oggi.
webaholik,

9

appena

$(window).resize();

è quello che uso ... a meno che non fraintenda quello che stai chiedendo.


3
E anche se hai jQuery, si innesca solo eventi associati a jQuery.
adamdport,

0

Risposta con RxJS

Di 'qualcosa come in angolare

size$: Observable<number> = fromEvent(window, 'resize').pipe(
            debounceTime(250),
            throttleTime(300),
            mergeMap(() => of(document.body.clientHeight)),
            distinctUntilChanged(),
            startWith(document.body.clientHeight),
          );

Se si desidera un abbonamento manuale (o non angolare)

this.size$.subscribe((g) => {
      console.log('clientHeight', g);
    })

Dal momento che il mio avvio iniziale con valore potrebbe essere errato (spedizione per correzione)

window.dispatchEvent(new Event('resize'));

In dire angolare (potrei ..)

<div class="iframe-container"  [style.height.px]="size$ | async" >..

0

Credo che questo dovrebbe funzionare per tutti i browser:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);

Funziona alla grande in Chrome e FF, ma non ha funzionato in IE11
Collins

@Collins - grazie per l'aggiornamento, pensavo di averlo verificato su IE11 ... Proverò a prendere un po 'di tempo dopo per aggiornarlo, grazie per il feedback.
webaholik,

0

Puoi farlo con questa libreria. https://github.com/itmor/events-js

const events = new Events();

events.add({  
  blockIsHidden: () =>  {
    if ($('div').css('display') === 'none') return true;
  }
});

function printText () {
  console.log('The block has become hidden!');
}

events.on('blockIsHidden', printText);

-3

window.resizeBy()attiverà l'evento onresize della finestra. Funziona in Javascript o VBScript .

window.resizeBy(xDelta, yDelta)chiamato mi piace window.resizeBy(-200, -200)ridurre la pagina 200px di 200px.


2
Perché questo è segnato? È errato? Dipende dal browser?
Peter Wone,

2
Questo non funziona in nessun browser: Chrome, Firefox, IE, Firefox testato.
fregante,

1
Firefox 7+, e probabilmente altri browser moderni, nella maggior parte dei casi non consentono più di chiamare questo metodo. Inoltre, non è desiderabile avere effettivamente ridimensionare la finestra per attivare l'evento.
user247702

Sia resizeBy () che resizeTo () funzionano bene nell'ultima versione stabile di Chrome. 76.0
VanagaS,
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.