Tarayıcılar arası pencere yeniden boyutlandırma etkinliği - JavaScript / jQuery


240

Firefox, WebKit ve Internet Explorer'da çalışan pencere yeniden boyutlandırma olayına dokunmanın doğru (modern) yöntemi nedir?

Ve her iki kaydırma çubuğunu da açabilir / kapatabilir misiniz?


Ben de buna bakıyorum. Burada sunulan çözümleri uygulamak istiyorum, ama korkarım sözdizimini anlamıyorum: $ (window). Bu jquery'ye özgü bir şey mi?
Byff

1
Byff, evet, $ (window) bir jQuery yapısıdır. window.onresize, ham JavaScript'te eşdeğerdir.
Andrew Hedges

Bu demo, herkesin tüm tarayıcılarda test etmesine yardımcı olabilir jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

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

Mobil cihazlarda Opera'da üst çubuk (tarayıcı arayüzü) her gösterildiğinde / gizlendiğinde tetiklenir.
psur

Yanıtlar:


367

jQuery bunun için yerleşik bir yönteme sahiptir :

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

UI yanıt verme uğruna, sen esinlenerek, aşağıdaki örnekte gösterildiği gibi, sadece milisaniye bazı sayısının ardından kodunuzu aramak için bir setTimeout kullanmayı düşünebilirsiniz bu :

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

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

34
Bu düğme, pencere düğmesi ile tam ekrana genişletildiğinde neden tetiklenmiyor?
Sly

2
@Sly Benim için Mac, Safari, Chrome ve Mozilla'da çalışıyor. Hangi tarayıcıyı kullanıyorsunuz?
Mark Vital

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

6
Elijah, bu JavaScript. Yazdıklarınız doğru değil (yeni ile inşa ettiğiniz belirli bir durum hariç).
Yoh Suzuki

3
Bu jQuery işlevinin, pencere yeniden boyutlandırılmasında çağırılması gereken geçerli işlevler listesine bir işlev çağrısı "eklediğini" belirtmek gerekir. Şu anda bir pencere boyutunda planlanmış olan mevcut olayların üzerine yazmaz.
RTF

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

    alert('resize');

});

4
Yeniden boyutlandırma () yöntemi aslında gerçekte tam bağlama yaklaşımı için bir kısayol olduğundan ben, bağlama yaklaşımı tercih ve sık sık genellikle daha ben bir olay işleyicisi daha olduğunu bulmak gerekir bir öğeye başvuracak.
Mike Kormendy

@Mike - Sadece bu değil, ama ben yeniden boyutlandırma yöntemi dinleyiciyi kaldırmak istediğiniz olayda "unbind" yöntemi yok tahmin ediyorum. "bağlama" kesinlikle gitmek için bir yoldur!
Shane

43

Yeniden boyutlandırma olayına dokunmanın jQuery olmayan yolu:

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

Tüm modern tarayıcılarda çalışır. It does not sizin için bir şey kelebeği. İşte bunun bir örneği .


bu çözüm IE'de çalışmaz. IE dom desteğiyle sabit sürüm: stackoverflow.com/questions/6927637/…
Sergey

1
> Sizin için hiçbir şey kısıtlamaz. Lütfen biraz açıklayabilir misiniz? Ne gevşetmeli / ne yapmalı? Olay arka arkaya birçok kez ateş olay ile ilgili mi?
josinalvo

@josinalvo genellikle sen ateşler bir olaya dinleme zaman bir sürü size isteyeceksiniz (örn lodash) gürültüye Eğer programda bir darboğaz neden bunu yok bu yüzden.
Jondlm

17

Eski bir ileti dizisi getirdiğim için üzgünüm, ancak birisi jQuery kullanmak istemiyorsa bunu kullanabilirsiniz:

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

8
Bunun window.onresize öğesine bağlı olabilecek tüm işleyicileri tıkayacağını unutmayın. Komut dosyanızın diğer komut dosyalarıyla bir ekosistem yaşaması gerekiyorsa, pencerenizin yeniden boyutlandırılmasında bir şey yapmak isteyen tek komut dosyası olduğunu varsaymamalısınız. JQuery gibi bir çerçeve kullanamıyorsanız, en azından varolan pencereyi kapmayı düşünmelisiniz. Tek boyutlandırma ve işleyicinizi sonuna kadar değil, sonuna kadar eklemeyi düşünmelisiniz.
Tom Auger

2
@TomAuger "en azından varolan pencereyi kapmayı düşünmelisiniz. Onresize , ve işleyicinizi sonuna eklemeyi düşünmelisiniz" - muhtemelen bunun tersini, yani "işleyicinizin sonunda mevcut işleyiciyi çağırmak" anlamına mı geliyorsunuz? Gerçekten zaten var olan fonksiyonun sonuna bir şeyler ekleyecek bir javascript kodu görmek istiyorum :-)
TMS

Demek istediğim, bir bakıma - yeni onResize işleyicinizin mevcut onResize öğesini sarması gerekiyor. Ancak, onResize'a eklemek istediğiniz işlevi orijinal onResize işleyicisini çağırıncaya kadar çağırmak zorunda değildir. Böylece, yeni onResize işlevinizin orijinal onResize işlevinden sonra çalıştığından emin olabilirsiniz, bu da muhtemelen tersinden daha iyidir.
Tom Auger


5

JQuery 1.9.1 kullanarak sadece teknik olarak aynı olmasına rağmen * buldum, bu IE10 (ama Firefox) işe yaramadı:

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

bu her iki tarayıcıda da çalışırken:

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

Düzenleme:
) * Aslında değil , teknik olarak özdeş olarak belirtildiği ve yorumlarına açıklandığı WraithKenny ve Henry Blyth .


1
İki değişiklik var. Hangisinin etkisi oldu? ( .resize()Hiç .bind('resize')? Veya anonim işlev ekleyerek bunu ikinci olduğunu düşünüyorum.)
WraithKenny

@WraithKenny İyi bir nokta. Anonim işlevi eklemenin, onu çalıştıran şey olması çok iyi olabilir. Denediğimi hatırlamıyorum.
bassim

1
İlk durumda, adjustSizeyöntem bağlamını kaybeder this, oysa ikinci çağrı CmsContent.adjustSize()korunur this, yani this === CmsContent. Eğer CmsContentörnek gereklidir adjustSizeyöntemle, daha sonra ilk vaka başarısız olur. İkinci durum her türlü işlev çağrısı için çalışacaktır, bu nedenle her zaman anonim bir işlev iletmeniz önerilir.
Henry Blyth

1
@HenryBlyth Teşekkür ederim! +1
bassim

4

jQuery$(window).resize()varsayılan olarak işlev sağlar :

<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

Ben jQuery eklentisi "jQuery resize olayı" tüm tarayıcılar aynı çalışır böylece olay daraltma ilgilenir gibi bunun için en iyi çözüm olarak düşünün. Andrews cevabına benzer, ancak yeniden boyutlandırma olayını belirli öğelere / seçicilere ve tüm pencereye bağlayabildiğiniz için daha iyidir. Temiz kod yazmak için yeni olanaklar açar.

Eklenti burada mevcuttur

Çok fazla dinleyici eklerseniz performans sorunları vardır, ancak çoğu kullanım durumunda mükemmeldir.


0

Buna daha fazla kontrol eklemeniz gerektiğini düşünüyorum:

    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

umarım jQuery'de yardımcı olacaktır

önce bir işlev tanımlayın, mevcut bir işlev varsa sonraki adıma geçin.

 function someFun() {
 //use your code
 }

tarayıcı yeniden boyutlandırma bu gibi kullanın.

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

0

Bahsedilen pencere yeniden boyutlandırma işlevlerinin yanı sıra, yeniden boyutlandırma olaylarının, olayları açığa çıkarmadan kullanıldığında çok fazla tetiklendiğini anlamak önemlidir.

Paul Irish, yeniden boyutlandırma çağrılarını büyük ölçüde azaltan mükemmel bir işleve sahiptir. Kullanımı çok önerilir. Çapraz tarayıcı çalışır. Geçen gün IE8 test ve hepsi iyiydi.

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

Farkı görmek için demoyu kontrol ettiğinizden emin olun .

İşte tamlık işlevi.

(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...
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.