¿Cómo activar el evento de cambio de tamaño de ventana en JavaScript?

327

He registrado un disparador en el cambio de tamaño de la ventana. Quiero saber cómo puedo activar el evento para que se llame. Por ejemplo, cuando oculto un div, quiero que se llame a mi función de activación.

Descubrí que window.resizeTo()puede activar la función, pero ¿hay alguna otra solución?

Zhongshu
fuente

Respuestas:

382

Siempre que sea posible, prefiero llamar a la función en lugar de enviar un evento. Esto funciona bien si tiene control sobre el código que desea ejecutar, pero vea a continuación los casos en los que no posee el código.

window.onresize = doALoadOfStuff;

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

En este ejemplo, puede llamar a la doALoadOfStufffunción sin enviar un evento.

En sus navegadores modernos, puede activar el evento usando:

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

Esto no funciona en Internet Explorer, donde tendrá que hacer la mano dura:

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

jQuery tiene el triggermétodo , que funciona así:

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

Y tiene la advertencia:

Aunque .trigger () simula una activación de evento, completa con un objeto de evento sintetizado, no replica perfectamente un evento natural.

También puede simular eventos en un 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
fuente
66
Su función anónima es innecesaria. window.onresize = doALoadOfStuff; Además, esto no responde la pregunta, la respuesta de pinouchon a continuación es la respuesta correcta.
Dennis Plucinik
42
Para Google r's: Echa un vistazo a la respuesta de @ avetisk.
Fabian Lauer
1
Es una buena idea desacoplar, pero en mi / este caso, no funciona. Simplemente llamar al método de cambio de tamaño no funciona porque si el cambio de tamaño de la ventana no se activa, varios otros div / contenedores no tendrán la altura adecuada establecida.
PandaWood
@PandaWood: entonces mi último ejemplo es mejor en su caso.
Fenton
Gracias @ user75525
Bondsmith
676
window.dispatchEvent(new Event('resize'));
avetisk
fuente
11
parece funcionar con Chrome, FF, Safari, pero no: IE!
Davem M
14
jQuery's en triggerrealidad no activa el evento nativo de "cambio de tamaño". Solo activa oyentes de eventos que se han agregado usando jQuery. En mi caso, una biblioteca de terceros estaba escuchando directamente el evento de "cambio de tamaño" nativo y esta es la solución que funcionó para mí.
chowey
2
Gran y sencilla solución. Aunque, creo que debería agregar algún código para la compatibilidad con IE (por lo que veo, para IE, tenemos que usar window.fireEvent)
Victor
35
esto no funcionó en todos los dispositivos para mí. Tuve que activar el evento de esta manera: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('cambiar tamaño', verdadero, falso, ventana, 0); window.dispatchEvent (evt);
Manfred
19
No funciona con "El objeto no admite esta acción" en mi IE11
pomber
156

Con jQuery, puede intentar llamar al activador :

$(window).trigger('resize');
Benjamin Crouzier
fuente
3
Un caso de uso para esto es cuando un complemento jQuery usa eventos de cambio de tamaño de ventana para responder, pero tiene una barra lateral colapsada. El contenedor del complemento cambia de tamaño, pero la ventana no.
isherwood
44
De hecho, no necesito JQuery, pero prefiero la solución JQuery ya que mi producto usa JQuery ampliamente.
Sri
¿Dónde se agregaría esto para cambiar el tamaño de una página de WordPress después de que se haya cargado?
SAHM
Esto no funciona para mí en el último Chrome, esta respuesta sí: stackoverflow.com/a/22638332/1296209
webaholik
1
esto es lo que intenté inicialmente, no funcionó, pero lo window.dispatchEvent(new Event('resize'));hice
user2682863
54

Un JS puro que también funciona en IE (del comentario de @Manfred )

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

O para angular:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});
pomber
fuente
44
Por desgracia, la documentación para UIEvent.initUIEvent () dice Do not use this method anymore as it is deprecated.Los documentos CreateEvent dicen "Muchos métodos utilizados con createEvent, como initCustomEvent, ya no son aprobadas. Use constructores de eventos en su lugar." Esta página parece prometedora para eventos de IU.
Racing Tadpole
99
Es cierto, pero IE11 no es compatible con el new Event()método. Creo que como un truco contra navegadores más antiguos podría hacer algo así if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Donde el método actual es la respuesta del avetisk .
BrianS
@pomber Gracias por la solución, en realidad estaba tratando de activar un evento personalizado para cambiar el tamaño de la ventana para cambiar el tamaño de mi gráfico ... su solución me salva el día
Dinesh Gopal Chand
49

Combinando las respuestas de pomber y avetisk para cubrir todos los navegadores y sin causar advertencias:

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
fuente
1
Esta es una buena manera de hacerlo en todos los navegadores sin usar jQuery.
kgx
ni idea de por qué esto no es la respuesta arriba ...... esto es mejor que el "bien" o respuestas que son aceptadas ....
SPillai
14

En realidad no pude hacer que esto funcionara con ninguna de las soluciones anteriores. Una vez que vinculé el evento con jQuery, funcionó bien de la siguiente manera:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');
BBQ Singular
fuente
Funciona en Chrome hoy.
webaholik
9

sólo

$(window).resize();

es lo que uso ... a menos que no entienda mal lo que está pidiendo.

Matt Sich
fuente
3
E incluso si tiene jQuery, solo desencadena eventos vinculados con jQuery.
adamdport
0

Respuesta con RxJS

Di como algo en angular

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

Si desea una suscripción manual (o no angular)

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

Dado que mi valor inicial startWith podría ser incorrecto (envío para corrección)

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

En decir Angular (podría ...)

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

Creo que esto debería funcionar para todos los 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
fuente
Funciona muy bien en Chrome y FF, pero no funcionó en IE11
Collins
@Collins: gracias por la actualización, pensé que había verificado esto en IE11 ... Intentaré tomarme un tiempo más tarde para actualizar esto, gracias por los comentarios.
webaholik
0

Puedes hacer esto con 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);
Es mor
fuente
-3

window.resizeBy()activará el evento onresize de la ventana. Esto funciona tanto en Javascript como en VBScript .

window.resizeBy(xDelta, yDelta)llamado como window.resizeBy(-200, -200)para reducir la página 200 px por 200 px.

A
fuente
2
¿Por qué está marcado esto? ¿Es incorrecto? ¿Es dependiente del navegador?
Peter Wone
2
Esto no funciona en ningún navegador: Chrome, Firefox, IE, Firefox probado.
fregante
1
Firefox 7+, y probablemente otros navegadores modernos, ya no permiten llamar a este método en la mayoría de los casos. Además, no es deseable cambiar el tamaño de la ventana para activar el evento.
user247702
Tanto resizeBy () como resizeTo () funcionan bien en la última versión estable de Chrome. 76.0
VanagaS