Como disparar o evento de redimensionamento de janela em JavaScript?

327

Registrei um gatilho no redimensionamento da janela. Quero saber como posso acionar o evento a ser chamado. Por exemplo, quando ocultar uma div, quero que minha função de gatilho seja chamada.

Descobri que window.resizeTo()pode disparar a função, mas existe alguma outra solução?

zhongshu
fonte

Respostas:

382

Sempre que possível, prefiro chamar a função em vez de despachar um evento. Isso funciona bem se você tiver controle sobre o código que deseja executar, mas veja abaixo os casos em que você não possui o código.

window.onresize = doALoadOfStuff;

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

Neste exemplo, você pode chamar a doALoadOfStufffunção sem despachar um evento.

Nos navegadores modernos, você pode acionar o evento usando:

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

Isso não funciona no Internet Explorer, onde você terá que fazer isso à mão:

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

O jQuery possui o triggermétodo , que funciona assim:

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

E tem a ressalva:

Embora .trigger () simule uma ativação de evento, completa com um objeto de evento sintetizado, ele não replica perfeitamente um evento que ocorre naturalmente.

Você também pode simular eventos em um elemento específico ...

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

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}
Fenton
fonte
6
Sua função anônima é desnecessária. window.onresize = doALoadOfStuff; Além disso, isso não responde à pergunta, a resposta de pinouchon abaixo é a resposta correta.
Dennis Plucinik
42
Para os r do Google : Veja a resposta do @ avetisk.
Fabian Lauer
1
É uma boa ideia desacoplar, mas no meu caso, não funciona. Apenas chamar o método de redimensionamento não funciona porque, se o redimensionamento da janela não for acionado, vários outros div / containers não terão a altura adequada.
PandaWood 10/06/16
@ PandaWood - então meu último exemplo é melhor no seu caso.
Fenton
Obrigado @ user75525
Bondsmith
676
window.dispatchEvent(new Event('resize'));
avetisk
fonte
11
parece funcionar com Chrome, FF, Safari, mas não: IE!
Davem H
14
O jQuery triggerrealmente não aciona o evento "redimensionar" nativo. Ele aciona apenas ouvintes de eventos que foram adicionados usando o jQuery. No meu caso, uma biblioteca de terceiros estava ouvindo diretamente o evento "redimensionar" nativo e esta é a solução que funcionou para mim.
Chowey 26/05
2
Solução ótima e simples. Embora, eu acho que você deve adicionar algum código para compatibilidade IE (tanto quanto eu ver, por IE, temos que usar window.fireEvent)
Victor
35
isso não funcionou em todos os dispositivos para mim. Eu tive que disparar o evento como este: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('redimensionar', verdadeiro, falso, janela, 0); window.dispatchEvent (evt);
Manfred
19
Ele falha com "objecto não suporta esta ação" na minha IE11
pomber
156

Com o jQuery, você pode tentar chamar o trigger :

$(window).trigger('resize');
Benjamin Crouzier
fonte
3
Um caso de uso para isso é quando um plug-in jQuery usa eventos de redimensionamento de janela para responder, mas você tem uma barra lateral em colapso. O contêiner do plug-in é redimensionado, mas a janela não.
Isherwood
4
Não há necessidade de JQuery, mas prefiro a solução JQuery, pois meu produto usa JQuery extensivamente.
Sri
Onde isso seria adicionado para redimensionar uma página do wordpress depois de carregada?
SAHM
Isto não está funcionando para mim no último Chrome, esta resposta faz: stackoverflow.com/a/22638332/1296209
webaholik
1
é isso que eu inicialmente tried- não funcionou, mas window.dispatchEvent(new Event('resize'));fez
user2682863
54

Um JS puro que também funciona no IE (do comentário do @Manfred )

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

Ou para angular:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});
pomber
fonte
4
Infelizmente, a documentação para UIEvent.initUIEvent () diz que Do not use this method anymore as it is deprecated.os documentos createEvent dizem "Muitos métodos usados ​​com createEvent, como initCustomEvent, estão obsoletos. Use construtores de eventos ." Esta página parece promissora para eventos da interface do usuário.
Racing Tadpole
9
Verdade, mas o IE11 não suporta o new Event()método. Eu acho que, como um truque contra navegadores mais antigos, você poderia fazer algo assim if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Onde o método atual é a resposta do avetisk .
precisa saber é
@pomber Obrigado pela solução, na verdade eu estava tentando acionar um evento personalizado para redimensionar janelas para redimensionar meu gráfico ... sua solução salvou meu dia
Dinesh Gopal Chand
49

Combinando as respostas de pomber e avetisk para cobrir todos os navegadores e não causar avisos:

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);
}
pfirpfel
fonte
1
Essa é uma boa maneira de fazer isso nos navegadores sem usar o jQuery.
KGX
nenhuma idéia porque esta não é a resposta top ...... este é melhor do que os "tanto ou" respostas que são aceitos ....
SPillai
14

Na verdade, não consegui fazer isso funcionar com nenhuma das soluções acima. Depois que vinculei o evento ao jQuery, ele funcionou bem como abaixo:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');
Churrasco Singular
fonte
Hoje funciona no Chrome.
Webaholik 15/09/19
9

somente

$(window).resize();

é o que eu uso ... a menos que eu entenda mal o que você está pedindo.

Matt Sich
fonte
3
E mesmo se você tiver o jQuery, ele dispara apenas eventos que foram associados ao jQuery.
adamdport
0

Resposta com RxJS

Diga como algo em Angular

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

Se a assinatura manual desejar (ou não angular)

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

Como meu valor inicial startWith pode estar incorreto (envio para correção)

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

Em dizer angular (eu poderia ..)

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

Eu acredito que isso deve funcionar para todos os navegadores:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);
webaholik
fonte
Funciona muito bem no Chrome e no FF, mas não funcionou no IE11
Collins
@ Collins - obrigado pela atualização, pensei ter verificado isso no IE11 ... vou tentar levar algum tempo depois para atualizar isso, obrigado pelo feedback.
webaholik 30/03
0

Você pode fazer isso com esta biblioteca. 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);
It Mor
fonte
-3

window.resizeBy()acionará o evento onresize da janela. Isso funciona em Javascript ou VBScript .

window.resizeBy(xDelta, yDelta)chamado gostaria window.resizeBy(-200, -200)de reduzir a página 200 px por 200 px.

PARA
fonte
2
Por que isso está marcado? Está incorreto? É dependente do navegador?
Peter Wone
2
Isso não funciona em nenhum navegador: Chrome, Firefox, IE, Firefox testado.
fregante 25/09
1
O Firefox 7 ou superior, e provavelmente outros navegadores modernos, não permitem mais chamar esse método na maioria dos casos. Além disso, não é desejável redimensionar a janela para acionar o evento.
precisa saber é o seguinte
ResizeBy () e resizeTo () estão funcionando bem na versão estável mais recente do Chrome. 76.0
VanagaS