Подія крос-браузера зміни розміру вікна - JavaScript / jQuery


240

Який правильний (сучасний) метод введення події у розмір вікна, який працює в Firefox, WebKit та Internet Explorer?

І чи можна вмикати / вимикати обидві смуги прокрутки?


Я також розглядаю це. Я б спробував застосувати запропоновані тут рішення, але боюся, що не розумію синтаксису: $ (window). Це щось специфічне для jquery?
Бифф

1
Byff, так, $ (window) - це конструкція jQuery. window.onresize - еквівалент у сирому JavaScript.
Ендрю Хедж

Ця демонстрація може допомогти комусь протестувати на всіх браузерах jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/…
Ділан Валаде

У Opera на мобільних пристроях він спрацьовує кожного разу, коли верхній рядок (інтерфейс браузера) відображається / ховається.
psur

Відповіді:


367

jQuery має вбудований метод для цього:

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

Заради чутливості інтерфейсу користувача, ви можете скористатися набором 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 Для мене це працює в Safari, Chrome і Mozilla на Mac. Який браузер ви використовуєте?
Марк Vital

2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Зак Заткін-Золото

6
Ілля, це JavaScript. Те, що ви написали, не є правильним (за винятком одного конкретного випадку, коли ви будуєте з новим).
Yoh Suzuki

3
Варто зазначити, що ця jQuery функція "додає" виклик функції до поточного списку функцій, які слід викликати у розмірі вікна. Він не перезаписує існуючі події, які зараз заплановані у розмірі вікна.
RTF

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

    alert('resize');

});

4
Я вважаю за краще підхід bind, оскільки метод resize () насправді є ярликом для підходу повного зв’язування, і я часто виявляю, що зазвичай існує більше одного обробника подій, який я повинен застосовувати до елемента.
Майк Корменді

@Mike - Мало того, але я здогадуюсь, що метод зміни розміру не має методу "відв'язати" у випадку, якщо ви хочете видалити слухача. "прив'язувати", безумовно, шлях!
Шейн

43

Ось не-jQuery спосіб входження в подію зміни розміру:

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

Він працює у всіх сучасних браузерах. Це нічого не придушує для вас. Ось приклад цього в дії.


це рішення не працює в IE. Виправлена ​​версія з підтримкою IE dom: stackoverflow.com/questions/6927637/…
Сергій

1
> Це нічого не пригнічує. Чи можете ви, будь ласка, докладно? Що повинно / могло б придушити? Чи це стосується події, яка ведеться багато разів поспіль?
josinalvo

@josinalvo, як правило, коли ви слухаєте подію, яка дуже спричиняє пожежу, вам захочеться дебютувати (наприклад, подати), щоб не викликати вузьких місць у вашій програмі.
Jondlm

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();
    };
});

Редагувати :)
* Насправді технічно не однакові, як зазначалося та пояснено у коментарях WraithKenny та Генрі Блайт .


1
Є дві зміни. Який з них мав ефект? ( .resize()до .bind('resize')або додавання анонімної функції? Я думаю, це друга.)
WraithKenny

@WraithKenny Добре. Цілком може бути те, що додавання анонімної функції було те, що змусило її працювати. Я не пам'ятаю, чи намагався я.
басим

1
У першому випадку adjustSizeметод втрачає свій контекст this, тоді як другий виклик CmsContent.adjustSize()зберігає this, тобто this === CmsContent. Якщо CmsContentв adjustSizeметоді потрібен екземпляр , то перший випадок не вдасться. Другий випадок буде працювати для кожного виду функції, тому рекомендується завжди передавати анонімну функцію.
Генрі Блайт

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 resize" найкращим рішенням для цього, оскільки він піклується про заглушку події, щоб вона працювала однаково у всіх браузерах. Це схоже на відповідь Ендрюса, але краще, оскільки ви можете підключити подію зміни розміру до конкретних елементів / селекторів, а також у всьому вікні. Це відкриває нові можливості писати чистий код.

Плагін доступний тут

Проблеми з продуктивністю є, якщо ви додасте багато слухачів, але для більшості випадків використання це ідеально.


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

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

Пол Ірландський має чудову функцію, яка значно знімає розміри дзвінків. Дуже рекомендується використовувати. Працює крос-браузер. Днями випробував його в 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...
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.