JavaScript'te pencere yeniden boyutlandırma olayı nasıl tetiklenir?


327

Pencere yeniden boyutlandırmasında bir tetikleyici kaydettim. Aranacak etkinliği nasıl tetikleyebileceğimi bilmek istiyorum. Örneğin, bir div'ı gizlerken tetikleyici işlevimin çağrılmasını istiyorum.

window.resizeTo()İşlevi tetikleyebileceğini buldum , ancak başka bir çözüm var mı?

Yanıtlar:


382

Mümkün olduğunda, bir olay göndermek yerine işlevi çağırmayı tercih ederim. Çalıştırmak istediğiniz kod üzerinde kontrolünüz varsa bu işe yarar, ancak kodun sahibi olmadığınız durumlar için aşağıya bakın.

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}

Bu örnekte, doALoadOfStuffbir olay göndermeden işlevi çağırabilirsiniz .

Modern tarayıcılarınızda, etkinliği aşağıdakileri kullanarak tetikleyebilirsiniz :

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

Bu, uzun elinizi yapmanız gereken Internet Explorer'da çalışmaz:

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

jQuery, aşağıdakitrigger gibi çalışan bir yönteme sahiptir :

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

Ve uyarı var:

.Trigger (), sentezlenmiş bir olay nesnesiyle tamamlanan bir olay etkinleştirmesini simüle etse de, doğal olarak oluşan bir olayı mükemmel şekilde çoğaltmaz.

Ayrıca belirli bir öğedeki etkinlikleri simüle edebilirsiniz ...

function simulateClick(id) {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

6
Anonim işleviniz gereksizdir. window.onresize = doALoadOfStuff; Ayrıca, bu soruya cevap vermez, pinouchon'un aşağıdaki cevabı doğru cevaptır.
Dennis Plucinik

42
To Google r en: @ avetisk cevabı göz at.
Fabian Lauer

1
Ayrıştırmak iyi bir fikir, ama benim / bu durumda işe yaramıyor. Yalnızca yeniden boyutlandırma yöntemini çağırmak işe yaramaz çünkü pencere yeniden boyutlandırması tetiklenmezse diğer div / kaplar uygun yükseklik ayarına sahip olmaz.
PandaWood

@PandaWood - o zaman son örneğim senin durumunda daha iyi.
Fenton

Thank you @ user75525
Bondsmith

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

11
Chrome, FF, Safari ile çalışıyor gibi görünüyor, ancak IE ile çalışmıyor!
Davem M

14
jQuery's triggeraslında yerel "yeniden boyutlandırma" olayını tetiklemez. Yalnızca jQuery kullanılarak eklenen olay dinleyicilerini tetikler. Benim durumumda, bir üçüncü taraf kütüphanesi doğrudan yerel "yeniden boyutlandırma" etkinliğini dinliyordu ve bu benim için çalışan çözümdü.
chowey

2
Harika ve basit bir çözüm. Rağmen, IE uyumluluğu için bazı kod eklemeniz gerektiğini düşünüyorum (gördüğüm kadarıyla, IE için kullanmak zorundayız window.fireEvent)
Victor

35
bu benim için tüm cihazlarda işe yaramadı. olayı şu şekilde tetiklemek zorunda kaldım: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('yeniden boyutlandır', doğru, yanlış, pencere, 0); window.dispatchEvent (EVT);
Manfred

19
Benim IE11 "Nesne bu eylemi desteklemiyor" ile başarısız
pomber

156

JQuery ile, tetikleyiciyi çağırmayı deneyebilirsiniz :

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

3
Bunun için bir kullanım durumu, bir jQuery eklentisinin yanıt vermek için pencere yeniden boyutlandırma olaylarını kullanması, ancak daraltma kenar çubuğunuzun olmasıdır. Eklentinin kapsayıcısı yeniden boyutlandırılır, ancak pencere değiştirilmez.
isherwood

4
Gerçekten JQuery gerek yok ama benim ürün JQuery yoğun kullandığı için JQuery çözüm tercih.
Sri

Bir wordpress sayfasını yükledikten sonra yeniden boyutlandırmak için bu nereye eklenir?
SAHM

Bu, en son Chrome'da benim için çalışmıyor, bu cevap
işe yarıyor

1
başlangıçta denedim bu window.dispatchEvent(new Event('resize'));oldu
user2682863

54

IE üzerinde de çalışan saf bir JS ( @Manfred yorumundan )

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

Veya açısal için:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});

4
Maalesef için dokümantasyon UIEvent.initUIEvent () diyor CreateEvent docs demek "artık kullanılmamaktadır, bu tür initCustomEvent olarak CreateEvent ile pek çok yöntem kullanılmıştır. Kullanım olay kurucular yerine." Bu sayfa kullanıcı arayüzü etkinlikleri için umut verici görünüyor. Do not use this method anymore as it is deprecated.
Yarış Tadpole

9
Doğru, ancak IE11 new Event()yöntemi desteklemiyor . Eski tarayıcılara karşı bir kesmek gibi düşünüyorum if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Mevcut yöntem avetisk'in cevabıdır .
BrianS

@pomber Çözüm için teşekkürler, Aslında grafiğimi yeniden boyutlandırmak için pencere yeniden boyutlandırma için özel bir olay tetiklemeye çalışıyordum ... çözümünüz günümü kurtarıyor
Dinesh Gopal Chand

49

Tüm tarayıcıları kapsayacak ve uyarılara neden olmayan bombacı ve avetisk'in cevaplarını birleştirmek:

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
Bu, jQuery kullanmadan tarayıcılar arasında yapmanın iyi bir yoludur.
kgx

neden bu en iyi cevap değil ...... hiçbir fikrim kabul edilir "ya da" cevaplar daha iyidir ....
SPillai

14

Aslında yukarıdaki çözümlerden herhangi biriyle çalışmasını sağlayamadım. Bir kez jQuery ile olay bağlı sonra aşağıdaki gibi iyi çalıştı:

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

Bugün Chrome'da çalışıyor.
webaholik

9

sadece

$(window).resize();

ne istediğimi yanlış anlamadım.


3
Ve jQuery olsa bile, sadece jQuery ile ilişkili olayları tetikler.
adamdport

0

RxJS ile yanıt

Açısal bir şey gibi söyle

size$: Observable<number> = fromEvent(window, 'resize').pipe(
            debounceTime(250),
            throttleTime(300),
            mergeMap(() => of(document.body.clientHeight)),
            distinctUntilChanged(),
            startWith(document.body.clientHeight),
          );

Manuel abonelik isteniyorsa (Veya Açısal Değil)

this.size$.subscribe((g) => {
      console.log('clientHeight', g);
    })

Benim intial yana startWith Değeri yanlış (düzeltilmesi için sevk) olabilir

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

Açısal olarak (yapabilirim ..)

<div class="iframe-container"  [style.height.px]="size$ | async" >..

0

Bunun tüm tarayıcılar için çalışması gerektiğine inanıyorum:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);

Chrome ve FF'de harika çalışıyor, ancak IE11'de çalışmadı
Collins

@Collins - güncelleme için teşekkürler, bunu IE11'de doğruladığımı düşündüm ... Bunu güncellemek için biraz zaman almaya çalışacağım, geri bildirim için teşekkürler.
webaholik

0

Bunu bu kütüphane ile yapabilirsiniz. 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()pencerenin onresize olayını tetikleyecektir. Bu, her iki çalışır JavaScript veya VBScript .

window.resizeBy(xDelta, yDelta)window.resizeBy(-200, -200)sayfa 200px 200px küçültmek için denir .


2
Bu neden işaretlendi? Yanlış mı? Tarayıcıya bağlı mı?
Peter Wone

2
Bu hiçbir tarayıcıda çalışmaz : Chrome, Firefox, IE, Firefox test edildi.
fregante

1
Firefox 7+ ve muhtemelen diğer modern tarayıcılar artık çoğu durumda bu yöntemin çağrılmasına izin vermiyor. Ayrıca, olayı tetiklemek için pencerenin yeniden boyutlandırılması arzu edilmez.
user247702

Hem resizeBy () hem de resizeTo () en son kararlı Chrome sürümünde iyi çalışıyor. 76.0
VanagaS
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.