Кросс-браузерное событие изменения размера окна - JavaScript / jQuery - PullRequest
238 голосов
/ 01 марта 2009

Каков правильный (современный) метод подключения к событию изменения размера окна, который работает в Firefox, WebKit и Internet Explorer?

А вы можете включить / выключить обе полосы прокрутки?

Ответы [ 11 ]

364 голосов
/ 03 июня 2010

jQuery имеет встроенный метод для этого:

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

Ради отзывчивости пользовательского интерфейса вы можете рассмотреть возможность использования setTimeout для вызова вашего кода только через некоторое количество миллисекунд, как показано в следующем примере, вдохновленном this :

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

var resizeTimer;
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(doSomething, 100);
});
48 голосов
/ 28 июля 2009
$(window).bind('resize', function () { 

    alert('resize');

});
42 голосов
/ 11 сентября 2013

Вот не-jQuery способ подключения к событию изменения размера:

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

Работает во всех современных браузерах. Это не душит ничего для вас. Вот пример этого в действии.

16 голосов
/ 17 июня 2012

Извините, что вызвал старую ветку, но если кто-то не хочет использовать jQuery, вы можете использовать это:

function foo(){....};
window.onresize=foo;
8 голосов
/ 01 марта 2009

Так как вы открыты для jQuery, этот плагин , кажется, делает свое дело.

5 голосов
/ 25 июня 2013

Используя 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();
    };
});

Edit:
) * На самом деле не технически идентичен, как отмечено и объяснено в комментариях WraithKenny и Генри Блит .

4 голосов
/ 02 сентября 2013

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 голосов
/ 07 марта 2011

Я считаю плагин jQuery «событие изменения размера jQuery» лучшим решением для этого, поскольку он заботится о регулировании события, чтобы он работал одинаково во всех браузерах. Это похоже на ответ Эндрюса, но лучше, поскольку вы можете привязать событие изменения размера к определенным элементам / селекторам, а также ко всему окну. Это открывает новые возможности для написания чистого кода.

Плагин доступен здесь

Существуют проблемы с производительностью, если вы добавляете много слушателей, но для большинства случаев использования это идеально.

0 голосов
/ 18 апреля 2016

Помимо упомянутых функций изменения размера окна, важно понимать, что события изменения размера запускаются много, если используются без удаления событий.

У Пола Айриша есть отличная функция, которая значительно снижает вызовы изменения размера. Очень рекомендуется использовать. Работает кросс-браузер. Протестировал его в 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...
});
0 голосов
/ 13 ноября 2013

надеюсь, это поможет в jQuery

сначала определите функцию, если существует существующая функция, перейдите к следующему шагу.

 function someFun() {
 //use your code
 }

браузер изменить размер использования, как эти.

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