2009-03-01 11 views
232

¿Cuál es el método correcto (moderna) para aprovechar la ventana de cambiar el tamaño de evento que funciona en Firefox, WebKit, e Internet Explorer?navegador Cruz evento de cambio de tamaño de ventana - JavaScript/jQuery

Y se puede convertir ambas barras de desplazamiento de encendido/apagado?

+0

También estoy investigando esto. Me gustaría tratar de aplicar las soluciones que se ofrecen aquí, pero me temo que no entiendo la sintaxis: $ (ventana). ¿Eso es algo específico de jQuery? – Byff

+1

Byff, sí, $ (ventana) es una construcción jQuery. window.onresize es el equivalente en JavaScript sin procesar. –

+0

Esta demostración puede ayudar a nadie a probar en todos los navegadores http://jsfiddle.net/subodhghulaxe/bHQV5/2/ –

Respuesta

361

jQuery tiene una built-in method para esto:

$(window).resize(function() { /* do something */ }); 

Por el bien de la capacidad de respuesta de interfaz de usuario, es posible considerar el uso de un setTimeout para llamar a su código sólo después de cierto número de milisegundos, como se muestra en la siguiente ejemplo, inspirado por this:

function doSomething() { 
    alert("I'm done resizing for the moment"); 
}; 

var resizeTimer; 
$(window).resize(function() { 
    clearTimeout(resizeTimer); 
    resizeTimer = setTimeout(doSomething, 100); 
}); 
+33

¿Por qué este evento no se activa cuando la ventana se expande a pantalla completa con el botón? – Sly

+2

@Sly Para mí funciona, en Safari, Chrome y Mozilla en Mac. ¿Qué navegador usas? –

+2

@Sly: '$ ('botón ') sucesivamente. ({Haga clic en: function() {/ * código */(ventana) .trigger $ (' redimensionar')})' –

8

Dado que usted está abierto a jQuery, this plugin parece hacer el truco.

48
$(window).bind('resize', function() { 

    alert('resize'); 

}); 
+4

yo prefiero el enfoque se unen, ya que el cambio de tamaño() método en realidad es en realidad un acceso directo para el enfoque se unen por completo, y me encuentro a menudo que generalmente hay más de un controlador de eventos que * debería * estar aplicando a un elemento. –

+0

@ Mike - No sólo eso, pero supongo el método de cambio de tamaño no tiene un método "desatar" en caso de que desea eliminar el oyente. "atar" es definitivamente el camino a seguir! – Shane

3

considero el plugin jQuery "jQuery cambiar el tamaño de evento" para ser la mejor solución para esto, ya que se encarga de acelera el evento para que funcione de la misma manera en todos los navegadores. Es similar a la respuesta de Andrews, pero es mejor ya que puede enganchar el evento de cambio de tamaño a elementos/selectores específicos, así como a toda la ventana. Abre nuevas posibilidades para escribir código limpio.

El plug-in está disponible here

Hay problemas de rendimiento si se agrega una gran cantidad de oyentes, pero para la mayoría de los casos de uso es perfecto.

16

este momento para que aparezca un viejo hilo, pero si alguien no quiere usar jQuery puede utilizar esto:

function foo(){....}; 
window.onresize=foo; 
+8

Tenga en cuenta que esto afectará a cualquier controlador existente que pueda estar vinculado a window.onresize. Si su secuencia de comandos tiene que vivir un ecosistema con otras secuencias de comandos, no debe suponer que su secuencia de comandos es la única que desea hacer algo en el cambio de tamaño de la ventana. Si no puede utilizar un marco como jQuery, al menos debería considerar tomar la ventana existente. Al mismo tiempo, y agregar su controlador al final, en lugar de bloquearlo por completo. –

+2

@TomAuger * "al menos deberías considerar tomar la ventana existente.aforo, y agregar tu controlador al final de la misma" * - probablemente dijiste lo contrario, es decir "llamar al controlador existente al final de tu controlador"? Realmente me gustaría ver un código de JavaScript que agregue algo al final de la función ya existente :-) – TMS

+0

Veo tu punto, en cierto sentido: tu nuevo manejador onResize debe envolver el existente onResize. Sin embargo, no tiene que llamar a la función que quería agregar a onResize hasta que haya llamado al controlador onResize original. Por lo tanto, aún puede asegurarse de que su nueva función onResize se ejecute después de la función original onResize, que probablemente sea mejor que la inversa. –

0

creo que se debe añadir un control adicional a esto:

var disableRes = false; 
    var refreshWindow = function() { 
     disableRes = false; 
     location.reload(); 
    } 
    var resizeTimer; 
    if (disableRes == false) { 
     jQuery(window).resize(function() { 
      disableRes = true; 
      clearTimeout(resizeTimer); 
      resizeTimer = setTimeout(refreshWindow, 1000); 
     }); 
    } 
5

Usando jQuery 1.9.1 acabo de descubrir que, aunque técnicamente idéntica) *, esto no funcionaba en IE10 (pero en Firefox):

// did not work in IE10 
$(function() { 
    $(window).resize(CmsContent.adjustSize); 
}); 

mientras este trabajaba en ambos navegadores:

// did work in IE10 
$(function() { 
    $(window).bind('resize', function() { 
     CmsContent.adjustSize(); 
    }; 
}); 

Editar:
) * En realidad no técnicamente idénticos, como se ha indicado y explicado en los comentarios por WraithKenny y Henry Blyth.

+1

Hay dos cambios. ¿Cuál tuvo el efecto? ('.resize()' a '.bind ('resize')' o agregando la función anónima? Estoy pensando que es el segundo.) – WraithKenny

+0

@WraithKenny Buen punto. Es muy posible que agregar la función anónima sea lo que lo hizo funcionar. No recuerdo si lo intenté. – bassim

+1

En el primer caso, el método 'adjustSize' pierde su contexto de' this', mientras que la segunda llamada 'CmsContent.adjustSize()' conserva 'this', es decir' this === CmsContent'. Si se requiere la instancia 'CmsContent' en el método' adjustSize', entonces el primer caso fallará. El segundo caso funcionará para cada tipo de llamada de función, por lo que se recomienda pasar siempre una función anónima. –

4

jQuery proporciona $(window).resize() función por defecto:

<script type="text/javascript"> 
// function for resize of div/span elements 
var $window = $(window), 
    $rightPanelData = $('.rightPanelData') 
    $leftPanelData = $('.leftPanelData'); 

//jQuery window resize call/event 
$window.resize(function resizeScreen() { 
    // console.log('window is resizing'); 

    // here I am resizing my div class height 
    $rightPanelData.css('height', $window.height() - 166); 
    $leftPanelData.css ('height', $window.height() - 236); 
}); 
</script> 
35

Aquí es la forma no jQuery de aprovechar el evento de cambio de tamaño:

window.addEventListener('resize', function(event){ 
    // do stuff here 
}); 

Funciona en todos los navegadores modernos. Hace no acelera cualquier cosa para ti. Here is an example de ella en acción.

+0

¡y es mucho más rápido! – vaskort

+0

esta solución no funcionaría en IE. Versión fija con soporte de IE dom: http://stackoverflow.com/questions/6927637/addeventlistener-in-internet-explorer – Sergey

+0

Funciona en IE 9+] (http://caniuse.com/#feat=addeventlistener) – Jondlm

0

esperan que ayude en jQuery

definir una función en primer lugar, si hay una función existente saltar al siguiente paso.

function someFun() { 
//use your code 
} 

el uso del navegador de cambio de tamaño como estos.

$(window).on('resize', function() { 
    someFun(); //call your function. 
}); 
0

Además de cambiar el tamaño de la ventana de funciones mencionadas, es importante entender que los eventos de cambio de tamaño mucho fuego si se utiliza sin un deboucing los eventos.

Paul irlandés tiene una excelente función que debounces el cambio de tamaño llama mucho. Muy recomendado para usar Funciona en todos los navegadores Lo probé en IE8 el otro día y todo estaba bien.

http://www.paulirish.com/2009/throttled-smartresize-jquery-event-handler/

Asegúrese de check out the demo para ver la diferencia.

Aquí es la función para la integridad.

(function($,sr){ 

    // debouncing function from John Hann 
    // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ 
    var debounce = function (func, threshold, execAsap) { 
     var timeout; 

     return function debounced() { 
      var obj = this, args = arguments; 
      function delayed() { 
       if (!execAsap) 
        func.apply(obj, args); 
       timeout = null; 
      }; 

      if (timeout) 
       clearTimeout(timeout); 
      else if (execAsap) 
       func.apply(obj, args); 

      timeout = setTimeout(delayed, threshold || 100); 
     }; 
    } 
    // smartresize 
    jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); }; 

})(jQuery,'smartresize'); 


// usage: 
$(window).smartresize(function(){ 
    // code that takes it easy... 
}); 
Cuestiones relacionadas