ブラウザー間ウィンドウのサイズ変更イベント-JavaScript / jQuery


240

Firefox、WebKit、およびInternet Explorer で機能するウィンドウサイズ変更イベントを利用するための正しい(最新の)メソッドは何ですか?

そして、両方のスクロールバーをオン/オフできますか?


私もこれを調べています。ここで提供されているソリューションを適用したいのですが、$(window)という構文が理解できません。それはjqueryに固有のものですか?
Byff

1
はい、$(window)はjQuery構成体です。window.onresizeは、未加工のJavaScriptでは同等です。
Andrew Hedges

このデモは、誰でもすべてのブラウザーjsfiddle.net/subodhghulaxe/bHQV5/2で
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/...
ディランValade

モバイル上のOperaでは、トップバー(ブラウザUI)が表示/非表示になるたびにトリガーされます。
2018

回答:


367

jQueryには、このための組み込みメソッドがあります。

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

UIの応答性のために、あなたが触発され、次の例に示すように、唯一のミリ秒単位のいくつかの数の後にあなたのコードを呼び出すためのsetTimeoutを使用して検討するかもしれないこの

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

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

34
ウィンドウがボタン付きの全画面に展開されているときに、このイベントが発生しないのはなぜですか?
スライ

2
@Sly私にとっては、MacのSafari、Chrome、Mozillaで動作します。どのブラウザを使用していますか?
Mark Vital 2012年

2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
ザック

6
エリヤ、これはJavaScriptです。あなたが書いたものは正しくありません(newで構築する場合の特定のケースを除いて)。
鈴木陽2013

3
このjQuery関数は、ウィンドウのサイズ変更時に呼び出す必要がある関数の現在のリストに関数呼び出しを「追加」することに言及する価値があります。ウィンドウのサイズ変更で現在スケジュールされている既存のイベントは上書きされません。
RTF、

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

    alert('resize');

});

4
resize()メソッドは実際には完全なバインドアプローチのショートカットであるため、私はバインドアプローチを好みます。また、通常、要素に適用する必要があるイベントハンドラーが複数あることに気づきます。
Mike Kormendy 2012

@Mike-それだけでなく、リスナーを削除したい場合、resizeメソッドには「バインド解除」メソッドがないと思います。「バインド」は間違いなく進むべき道です!
シェーン

43

次に、サイズ変更イベントを利用する非jQueryの方法を示します。

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

最新のすべてのブラウザで動作します。それはあなたのために何もスロットルしませ。これが動作中のです。


このソリューションはIEでは機能しません。:IEのDOMのサポートを修正したバージョン stackoverflow.com/questions/6927637/...
セルゲイ

1
>それはあなたのために何もスロットルしません。詳しく説明してもらえますか?何を調整する必要がありますか?それは何回も連続して発生するイベントに関連していますか?
josinalvo 2017

@josinalvoは、通常、大量に発生するイベントをリッスンしているときにデバウンス(たとえば、lodash)して、プログラムでボトルネックを引き起こさないようにします。
Jondlm 2017

17

古いスレッドを表示して申し訳ありませんが、誰かがjQueryを使用したくない場合は、これを使用できます:

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

8
これにより、window.onresizeにバインドされている可能性のある既存のハンドラーがすべて破棄されることに注意してください。スクリプトが他のスクリプトとエコシステムを共存させる必要がある場合、ウィンドウのサイズ変更で何かを実行したいのはそのスクリプトだけであると想定しないでください。jQueryなどのフレームワークを使用できない場合は、少なくとも既存のwindow.onresizeを取得して、ハンドラーを完全に破壊するのではなく、その末尾にハンドラーを追加することを検討してください。
トム・オージェ

2
@TomAuger 「少なくとも、既存のwindow.onresizeを取得して、ハンドラーをその末尾に追加することを検討する必要があります」 -おそらく反対の意味、つまり「ハンドラーの末尾で既存のハンドラーを呼び出す」ですか?私は本当に、既存の関数の最後に何かを追加するJavaScriptコードを見たいです:-)
TMS

私はある意味であなたの要点を理解しています-新しいonResizeハンドラーは既存のonResizeをラップする必要があります。ただし、元のonResizeハンドラーが呼び出されるまで、onResizeに追加したい関数を呼び出す必要はありません。そのため、元のonResize関数の後に新しいonResize関数が実行されることを確認できます。これは、おそらく逆の場合よりも優れています。
トム・オージェ


5

jQuery 1.9.1を使用して、技術的には同じですが*)、IE10では(Firefoxでは)機能しないことがわかりました。

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

これは両方のブラウザで機能しましたが、

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

編集:
)* WraithKennyHenry Blythのコメントに記載および説明されているように、実際に技術的に同一ではありません


1
2つの変更点があります。どれが影響しましたか?(.resize().bind('resize')?または匿名関数を追加し、私はそれが第二だと思っています。)
WraithKenny

@WraithKenny良い点。匿名関数を追加したことが機能したのかもしれません。やってみたか思い出せない。
bassim

1
最初のケースでは、adjustSizeメソッドはのコンテキストを失いますがthis、2番目の呼び出しでCmsContent.adjustSize()this、つまりが保持されthis === CmsContentます。場合はCmsContent、インスタンスが要求されるadjustSize方法は、最初のケースは失敗します。2番目のケースはあらゆる種類の関数呼び出しで機能するため、常に無名関数を渡すことをお勧めします。
Henry Blyth 2017

1
@HenryBlythありがとうございます!+1
bassim

4

jQuery$(window).resize()デフォルトで機能を提供します:

<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

jQueryプラグイン「jQuery resize event」は、すべてのブラウザーで同じように機能するようにイベントを調整するので、このための最良のソリューションであると考えています。アンドリュースの回答に似ていますが、ウィンドウ全体だけでなく、特定の要素/セレクターにサイズ変更イベントをフックできるため、より優れています。クリーンなコードを書く新しい可能性を開きます。

プラグインはこちらから入手できます

多くのリスナーを追加するとパフォーマンスの問題が発生しますが、ほとんどの場合、それは完璧です。


0

これにさらに制御を追加する必要があると思います。

    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

jQueryに役立つことを願っています

最初に関数を定義します。既存の関数がある場合は、次の手順に進みます。

 function someFun() {
 //use your code
 }

このようなブラウザのサイズ変更の使用。

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

0

前述のウィンドウのサイズ変更関数に加えて、イベントのデバッグを行わずにサイズ変更イベントを使用すると、多くのイベントが発生することを理解することが重要です。

Paul Irishには、サイズ変更の呼び出しを大幅にデバウンスする優れた機能があります。使用することをお勧めします。クロスブラウザで動作します。先日IE8でテストしたところ、すべて問題ありませんでした。

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

違いを確認するには、必ずデモチェックしてください。

これが完全性のための関数です。

(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...
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.