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?

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

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

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

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

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

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

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.


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" >..

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

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

-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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.