¿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?

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

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

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

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

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

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

Funciona en Chrome hoy.
webaholik

9

sólo

$(window).resize();

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


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

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

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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.