Evento de redimensionamento da janela entre navegadores - JavaScript / jQuery


240

Qual é o método (moderno) correto para tocar no evento de redimensionamento de janela que funciona no Firefox, WebKit e Internet Explorer?

E você pode ativar / desativar as duas barras de rolagem?


Eu também estou olhando para isso. Gostaria de tentar aplicar as soluções oferecidas aqui, mas tenho medo de não entender a sintaxe: $ (window). Isso é algo específico para o jquery?
Byff

1
Byff, sim, $ (window) é uma construção jQuery. window.onresize é o equivalente em JavaScript bruto.
Andrew Hedges

Esta demonstração pode ajudar alguém para teste em todos os navegadores jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/…
Dylan Valade

No Opera no celular, é acionado sempre que a barra superior (UI do navegador) é exibida / oculta.
Psur #

Respostas:


367

O jQuery possui um método interno para isso:

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

Por uma questão de responsividade da interface do usuário, considere usar um setTimeout para chamar seu código somente após um número de milissegundos, conforme mostrado no exemplo a seguir, inspirado por isso :

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

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

34
Por que esse evento não é acionado quando a janela é expandida para tela cheia com o botão?
Sly

2
@Sly Para mim, funciona no Safari, Chrome e Mozilla no Mac. Que navegador você usa?
Mark Vital

2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Zack Zatkin-Gold

6
Elijah, isso é JavaScript. O que você escreveu não está correto (exceto um caso específico quando você está construindo com o novo).
Yoh Suzuki

3
Vale ressaltar que essa função jQuery "adiciona" uma chamada de função à lista atual de funções que devem ser chamadas em um redimensionamento de janela. Ele não substitui os eventos existentes que estão atualmente agendados em um redimensionamento de janela.
RTF

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

    alert('resize');

});

4
Eu prefiro a abordagem de vinculação, pois o método resize () é realmente um atalho para a abordagem de vinculação completa e, geralmente, acho que geralmente há mais de um manipulador de eventos que devo aplicar a um elemento.
Mike Kormendy

@ Mike - Não é só isso, mas eu estou supondo que o método de redimensionamento não tem um método "unbind" no caso de você querer remover o ouvinte. "vincular" é definitivamente o caminho a seguir!
Shane

43

Aqui está a maneira não-jQuery de acessar o evento de redimensionamento:

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

Funciona em todos os navegadores modernos. Ele faz não acelerador qualquer coisa para você. Aqui está um exemplo disso em ação.


esta solução não funcionaria no IE. Versão corrigida com suporte do IE dom: stackoverflow.com/questions/6927637/…
Sergey

1
> Não limita nada para você. Você poderia por favor elaborar? O que deveria / iria estrangular? Está relacionado ao evento disparado várias vezes seguidas?
josinalvo

@josinalvo Geralmente, quando você está ouvindo um evento que é acionado muito, você deve rejeitá -lo (por exemplo, lodash) para não causar gargalo no seu programa.
Jondlm

17

Desculpe abrir um tópico antigo, mas se alguém não quiser usar o jQuery, você pode usar o seguinte:

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

8
Esteja ciente de que isso prejudicará qualquer manipulador existente que possa estar vinculado a window.onresize. Se o seu script precisar viver em um ecossistema com outros scripts, você não deve assumir que o script é o único a querer fazer algo no redimensionamento da janela. Se você não pode usar uma estrutura como o jQuery, considere, pelo menos, pegar a janela existente.onresize e adicionar seu manipulador ao final dela, em vez de suborná-la completamente.
Tom Auger

2
@TomAuger "você deveria pelo menos considerar pegar a janela existente. Redimensionar e adicionar seu manipulador ao final" - você provavelmente quis dizer o contrário, ou seja, "chamar o manipulador existente no final do manipulador"? Eu realmente gostaria de ver um código javascript que gostaria de acrescentar algo para o fim da função já existente :-)
TMS

Eu entendo o seu ponto, de certo modo - seu novo manipulador onResize precisa agrupar o onResize existente. No entanto, ele não precisa chamar a função que você deseja adicionar ao onResize até que ele tenha chamado o manipulador onResize original. Portanto, você ainda pode garantir que sua nova função onResize seja executada após a função original onResize, que provavelmente é melhor que o inverso.
Tom Auger


5

Usando o jQuery 1.9.1, descobri que, embora tecnicamente idêntico) *, isso não funcionava no IE10 (mas no Firefox):

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

enquanto isso funcionava nos dois navegadores:

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

Edit :)
* Na verdade, não é tecnicamente idêntico, conforme observado e explicado nos comentários de WraithKenny e Henry Blyth .


1
Há duas mudanças. Qual teve o efeito? ( .resize()A .bind('resize')? Ou adicionar a função anônima que eu estou pensando que é o segundo.)
WraithKenny

@WraithKenny Good point. Pode muito bem ter sido a adição da função anônima que a fez funcionar. Não me lembro se tentei.
bassim 26/05

1
No primeiro caso, o adjustSizemétodo perde seu contexto de this, enquanto a segunda chamada CmsContent.adjustSize()preserva this, ie this === CmsContent. Se a CmsContentinstância for necessária no adjustSizemétodo, o primeiro caso falhará. O segundo caso funcionará para todos os tipos de chamadas de funções; portanto, é recomendável sempre passar uma função anônima.
Henry Blyth

1
@HenryBlyth Obrigado! +1
bassim

4

jQueryfornece $(window).resize()função por padrão:

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

3

Considero que o plugin jQuery "evento de redimensionamento jQuery" é a melhor solução para isso, pois ele cuida da limitação do evento para que ele funcione da mesma forma em todos os navegadores. É semelhante à resposta de Andrews, mas é melhor, pois você pode conectar o evento de redimensionamento a elementos / seletores específicos, bem como a janela inteira. Abre novas possibilidades para escrever código limpo.

O plugin está disponível aqui

Existem problemas de desempenho se você adicionar muitos ouvintes, mas para a maioria dos casos de uso é perfeito.


0

Eu acho que você deve adicionar mais controle a isso:

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

0

espero que ajude no jQuery

defina uma função primeiro, se houver uma função existente, pule para a próxima etapa.

 function someFun() {
 //use your code
 }

redimensionar o navegador use como estes.

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

0

Além das funções de redimensionamento da janela mencionadas, é importante entender que os eventos de redimensionamento são acionados muito se usados ​​sem que os eventos sejam reduzidos.

Paul Irish tem uma excelente função que rebaixa o redimensionamento de chamadas. Muito recomendado para usar. Funciona em vários navegadores. Testei no IE8 outro dia e estava tudo bem.

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

Verifique a demonstração para ver a diferença.

Aqui está a função de completude.

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