2009-11-30 17 views
223

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

Encontré window.resizeTo() puede activar la función, pero ¿hay alguna otra solución?

+0

He documentado algunos de los enfoques también http://thewebjuice.com/?p=309&preview=true –

Respuesta

219

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 consulte 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, se puede llamar a la función doALoadOfStuff sin el envío de un evento.

En sus navegadores modernos, puede trigger the event usando:

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

esto no funciona en Internet Explorer, en el que tendrá que hacer la escritura a mano:

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

jQuery has the trigger method, que funciona de la siguiente manera:

$(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); 
} 
+6

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

+31

Para ** Google ** r's: Eche un vistazo a la respuesta de @ avetisk. –

+1

Es una buena idea desacoplar, pero en mi/este caso, no funciona. Simplemente llamando al método de cambio de tamaño no funciona porque si no se activa el cambio de tamaño de la ventana, otros div/contenedores no tendrán la altura adecuada establecida. – PandaWood

138

con jQuery, se puede tratar de llamar trigger:

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

Un caso de uso para esto es cuando un complemento jQuery utiliza eventos de cambio de tamaño de ventana para responder, pero tiene una barra lateral contraída. El contenedor del complemento se redimensiona, pero la ventana no. – isherwood

+3

[No es necesario para jQuery] (http://stackoverflow.com/a/18693617/1269037). –

+3

No es necesario JQuery, pero prefiero la solución JQuery ya que mi producto utiliza JQuery de manera exhaustiva. – Sri

569
window.dispatchEvent(new Event('resize')); 
+9

parece funcionar con Chrome, FF, Safari, pero no: ¡IE! –

+8

jQuery's 'trigger' en realidad no activa el evento nativo" resize ". Solo desencadena detectores de eventos que se han agregado mediante jQuery. En mi caso, una biblioteca de terceros estaba escuchando directamente el evento nativo de "cambio de tamaño" y esta es la solución que funcionó para mí. – chowey

+2

Solución genial y simple. Aunque, creo que debería agregar algún código para la compatibilidad de IE (hasta donde veo, para IE, tenemos que usar 'window.fireEvent') – Victor

-2

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

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

+1

¿Por qué está marcado? ¿Es incorrecto? ¿Es dependiente del navegador? –

+1

Esto no funciona en ** cualquier ** navegador: Chrome, Firefox, IE, Firefox probado. –

+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. – Stijn

10

No pude hacer que funcionara con ninguna de las soluciones anteriores. Una vez que el evento ligado con jQuery entonces funcionó bien como a continuación:

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

no funcionó en Chrome e IE11 –

5

simplemente

$(window).resize(); 

es lo que yo uso ... a menos que mal lo que está pidiendo.

+0

Esto es solo jQuery, mientras que la pregunta es sobre javascript. –

+2

E incluso si tiene jQuery, solo desencadena eventos vinculados con jQuery. – adamdport

+5

@Koen.pero hay una etiqueta jQuery en la pregunta. jQuery es una biblioteca de JavaScript. Por lo tanto, es válido incluir una solución que utilice jQuery. La pregunta no dice usar javascript puro. – JGallardo

44

Un JS puro, que también funciona en IE (de @Manfred comment)

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

Desafortunadamente, la documentación de [UIEvent.initUIEvent()] (https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/initUIEvent) dice 'No use este método más ya que está en desuso. 'The [createEvent docs] (https://developer.mozilla.org/en-US/docs/Web/API/Document/createEvent#Notes) dice:" Muchos métodos utilizados con createEvent, como initCustomEvent, están en desuso. Use [ constructores de eventos] (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) ". [Esta página] (https://developer.mozilla.org/en-US/docs/Web/API/UIEvent) parece prometedora para los eventos de UI. –

+8

Es cierto, pero IE11 no admite el método 'new Event()'. Creo que como un hack contra navegadores más antiguos se podría hacer algo como 'if (Event.prototype.initEvent) {/ * método obsoleto * /} else {/ * método actual * /}'. Donde el método actual es la [respuesta de Avetisk] (http://stackoverflow.com/a/18693617/264628). – BrianS

14

Combinando las respuestas de pomber y avetisk de cubrir todos los navegadores y no advertencias que causan:

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

Esta es una buena forma de hacerlo en todos los navegadores sin usar jQuery. – kgx

Cuestiones relacionadas