JavaScriptでウィンドウサイズ変更イベントをトリガーする方法


327

ウィンドウのサイズ変更のトリガーを登録しました。呼び出されるイベントをトリガーする方法を知りたい。たとえば、divを非表示にするときは、トリガー関数を呼び出す必要があります。

window.resizeTo()関数をトリガーできることがわかりましたが、他の解決策はありますか?

回答:


382

できれば、イベントをディスパッチするよりも関数を呼び出す方を好みます。これは、実行するコードを制御できる場合はうまく機能しますが、コードを所有していない場合については、以下を参照してください。

window.onresize = doALoadOfStuff;

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

この例でdoALoadOfStuffは、イベントを送出せずに関数を呼び出すことができます。

最新のブラウザーでは、次のコマンドを使用してイベントトリガーできます。

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

これはInternet Explorerでは機能しません。筆記体を実行する必要があります。

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

jQueryには、次のtriggerように機能するメソッドがあります。

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

そして警告があります:

.trigger()は、イベントのアクティブ化をシミュレートしますが、合成されたイベントオブジェクトを備えていますが、自然に発生するイベントを完全には複製しません。

特定の要素のイベントをシミュレートすることもできます...

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

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

6
匿名関数は不要です。window.onresize = doALoadOfStuff; また、これは質問には答えません。以下のpinouchonの答えが正しい答えです。
Dennis Plucinik 2013

42
Googleの Rさん:@ avetiskの答えを見てください。
Fabian Lauer、2015年

1
分離するのは良い考えですが、私の場合、この場合は機能しません。ウィンドウのサイズ変更がトリガーされないと、他のさまざまなdiv /コンテナーに適切な高さが設定されないため、resizeメソッドを呼び出すだけでは機能しません。
PandaWood 2016年

@PandaWood-私の最後の例はあなたの場合に優れています。
Fenton

ありがとう@ user75525
Bondsmith

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

11
Chrome、FF、Safariでは動作するようですが、IEでは動作しません。
Davem M 2014

14
jQuery triggerは実際にはネイティブの「サイズ変更」イベントをトリガーしません。jQueryを使用して追加されたイベントリスナーのみをトリガーします。私の場合、サードパーティのライブラリがネイティブの「サイズ変更」イベントを直接聞いていましたが、これが私にとってうまくいったソリューションです。
Chowey 2014年

2
素晴らしいシンプルなソリューション。IEとの互換性のためにいくつかのコードを追加する必要があると思いますが(私が見る限り、IEではを使用する必要がありますwindow.fireEvent
Victor

35
これは私にとってすべてのデバイスで動作しませんでした。次のようにイベントをトリガーする必要がありました。var evt = document.createEvent( 'UIEvents'); evt.initUIEvent( 'resize'、true、false、window、0); window.dispatchEvent(evt);
Manfred

19
IE11で「オブジェクトはこのアクションをサポートしていません」で失敗します
15

156

jQueryを使用すると、トリガーを呼び出すことができます。

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

3
これの使用例は、jQueryプラグインがウィンドウのサイズ変更イベントを使用して応答するが、折りたたみサイドバーがある場合です。プラグインのコンテナはサイズ変更されますが、ウィンドウはサイズ変更されません。
isherwood 2014年

4
確かにJQueryは必要ありませんが、私の製品はJQueryを幅広く使用しているため、JQueryソリューションを好みます。
スリ

これがロードされた後にワードプレスのページのサイズを変更するためにこれはどこに追加されますか?
SAHM 2016

これは、最新のChromeで私のために働いていない、この答えはありません:stackoverflow.com/a/22638332/1296209を
webaholik

1
これは私が最初に試したものですwindow.dispatchEvent(new Event('resize'));
うまくいき

54

IEでも動作する純粋なJS(@Manfredコメントから)

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

または角度の場合:

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

4
残念ながら、UIEvent.initUIEvent()のドキュメントにはDo not use this method anymore as it is deprecated.createEventドキュメントで「createEventで使用される多くのメソッド(initCustomEventなど)は非推奨です。代わりにイベントコンストラクターを使用してください」と記載されています。このページは、UIイベントに有望です。
Racing Tadpole

9
真ですが、IE11はこのnew Event()メソッドをサポートしていません。古いブラウザへのハックとして、次のようなことができると思いますif (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }。現在の方法は、avetiskの答えです。
BrianS

@pomber解決策をありがとう、実際にウィンドウのサイズ変更のカスタムイベントをトリガーしてチャートのサイズを変更しようとしていました...あなたの解決策は私の日を節約します
Dinesh Gopal Chand

49

pomberとavetiskの回答を組み合わせてすべてのブラウザーをカバーし、警告を発生させないようにします。

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
これは、jQueryを使用せずにブラウザー間で実行するのに適した方法です。
kgx 2018年

なぜこれがトップの回答ではないのかわからない......これは、受け入れられる「どちらかまたは」の回答よりも優れている....
SPillai

14

これを上記のソリューションのいずれかで実際に動作させることはできませんでした。イベントをjQueryにバインドすると、以下のようにうまく機能しました。

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

今日Chromeで動作します。
webaholik 2018

9

ただ

$(window).resize();

私が使っているのは...あなたが求めていることを誤解しない限り。


3
また、jQueryがある場合でも、jQueryにバインドされたイベントのみをトリガーします。
adamdport 2016

0

RxJSでの応答

Angularで何かのように言う

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

手動サブスクリプションが必要な場合(またはAngularでない場合)

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

私の最初のstartWith値が正しくない可能性があるため(修正のためのディスパッチ)

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

ある意味でAngular(私はできました..)

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

0

これはすべてのブラウザで機能するはずです:

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とFFではうまく機能しますが、IE11では機能しませんでした
コリンズ

@Collins-IE11でこれを確認したと思って更新をありがとう...フィードバックをありがとう、これを更新するのにしばらく時間がかかるようにします。
webaholik

0

このライブラリでこれを行うことができます。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()ウィンドウのonresizeイベントをトリガーします。これは、JavascriptまたはVBScriptの両方で機能します。

window.resizeBy(xDelta, yDelta)window.resizeBy(-200, -200)ページを200px x 200pxに縮小するように呼び出されました。


2
これはなぜマークダウンされているのですか?間違いですか?ブラウザに依存していますか?
Peter Wone 2014年

2
これはどのブラウザで機能しません:Chrome、Firefox、IE、Firefoxでテスト済み。
-fregante

1
Firefox 7以降、そしておそらく他の最新のブラウザーでは、ほとんどの場合、このメソッドを呼び出すことができなくなりました。さらに、イベントをトリガーするために実際にウィンドウのサイズを変更することは望ましくありません。
user247702

resizeBy()とresizeTo()の両方が、最新の安定したChromeバージョンで正常に動作しています。76.0
VanagaS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.