Событие изменения размера jQuery не срабатывает

По какой причине следующее:

$(function() {
  $(window).resize(function() {
    alert("resized!");
  });
});

запускает событие только при загрузке страницы. Изменение размера окна браузера ничего не дает ни в Safari, ни в Firefox. В других браузерах не пробовал.

Любые идеи или обходной путь?


person brettish    schedule 15.04.2011    source источник
comment
Это позор, потому что у меня тоже есть эта проблема, но у меня нет конфликта пространства имен resize(). Я использовал Visual Studio для отладки стека вызовов, и он исходит из браузера, а не из строки кода в моей кодовой базе. У меня есть хакерский обходной путь, поэтому я буду двигаться дальше, но я думаю, что в этой проблеме что-то есть, поскольку другие также сообщали об этом поведении.   -  person Marcus Pope    schedule 26.09.2012
comment
forum.jquery.com/topic/window- resize-fireing-on-page-load-in-ie9 Хакерский обходной путь для меня заключался в том, чтобы установить для временной переменной значение true при загрузке dom, установить для нее значение false и выйти из функции закрытия изменения размера, если временная переменная была истинный.   -  person Marcus Pope    schedule 26.09.2012


Ответы (7)


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

 $(window).resize(function() {
   $('body').prepend('<div>' + $(window).width() + '</div>');
 });

jsfiddle

person mcgrailm    schedule 15.04.2011
comment
Я тоже пробовал это (из документов jQuery resize()), и он отображает начальную ширину, когда страница загружается (или перезагружается), но ничего не происходит, когда я изменяю размер окна браузера. Вздох. - person brettish; 16.04.2011
comment
@brettish есть ли у вас другие js / jquery, которые я влияю, вы получаете сообщение об ошибке в консоли ошибок? - person mcgrailm; 16.04.2011
comment
@mcgrailm возможно, что-то влияет на вещи ... но нет, сообщений об ошибках нет. Я собираюсь попытаться определить, почему он не работает на моей странице, но работает в ссылке, размещенной balexandre. - person brettish; 16.04.2011
comment
Это было что-то еще в коде, что все испортило. Я должен был поймать это раньше. См. комментарий, который я оставил на вопрос о причине. Спасибо за помощь! - person brettish; 16.04.2011
comment
@brettish рад, что ты нашел проблему. не будь так строг к себе чувак все делают ошибки - person mcgrailm; 16.04.2011

лучше избегать присоединения к событиям, которые потенциально могут генерировать много срабатываний, таких как изменение размера окна и прокрутка тела, лучший подход к лавинной рассылке из этих событий - использовать таймер и проверять, произошло ли событие, а затем выполнять правильное действие , что-то вроде этого:

$(function() {
    var $window = $(window);
    var width = $window.width();
    var height = $window.height();

    setInterval(function () {
        if ((width != $window.width()) || (height != $window.height())) {
            width = $window.width();
            height = $window.height();

            alert("resized!");
        }
    }, 300);
});

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

person Kris Ivanov    schedule 16.04.2011
comment
Это решение будет запускать закрытие setInterval каждые 300 мс до бесконечности, что не является оптимальным подходом для высокопроизводительных сайтов. Вот лучший подход к проблеме: marcuspope.com/better-resize-event-handler< /а> - person Marcus Pope; 26.09.2012
comment
Вот JSFIddle кода, на который ссылается Маркус Поуп (на случай, если он когда-нибудь выйдет из строя) - person Hanna; 05.08.2014
comment
в последние несколько лет рекомендуется подписываться на событие и использовать throttle, избегая чрезмерной обработки lodash.com/docs #дроссель - person Kris Ivanov; 16.01.2015
comment
вы можете использовать функцию дросселя вместе с изменением размера окна, поэтому событие происходит только в том случае, если размер окна изменяется, а обработчик не выполнялся в течение последних 300 мс. - person santiago arizti; 06.03.2018
comment
Спасибо @MarcusPope, это лучший подход, который я когда-либо видел. - person blackem; 20.03.2018
comment
@МаркусПоуп КИНГ - person Ali Al Amine; 26.09.2019

работает в любом браузере:

http://jsbin.com/uyovu3/edit#preview

$(window).resize(function() {
  $('body').prepend('<div>' + $(window).width() + '</div>');
});
person balexandre    schedule 15.04.2011
comment
когда я использую ссылку, она работает. Но когда я использую его на своей странице, это не так. Я собираюсь выяснить, что не нравится в моей странице. - person brettish; 16.04.2011

5 лет спустя...

Единственный браузер, с которым у меня возникла эта проблема, — это Chrome; У меня нет Сафари.

Я заметил паттерн, который работает, когда я встраиваю код:

<script type="text/javascript">
    $(window).resize(function(e) { console.log("resize inline", +new Date()) });
</script>

но нет, когда я помещаю его в отдельный файл Javascript, который я загружаю:

<script type="text/javascript" src="/js/resized.js"></script>

где скрипт содержит

console.log('script loaded');
$(window).resize(function(e) { console.log("resize in script file", +new Date()) });

Я могу только догадываться, что это какая-то «защита», встроенная командой разработчиков Chrome, но это глупо и раздражает. По крайней мере, они могли позволить мне обойти это, используя некоторую «политику того же домена».

Обновить некоторое время. Я думал, что с помощью $(document).ready() это исправлено, но, видимо, я ошибался.

person bart    schedule 23.12.2016

пытаться

$(document).resize(function(){ ... };);

Я думаю, что это документ, который последовательно запускает изменение размера в браузерах. Но я сейчас не на работе, чтобы проверить, что я обычно делаю.

person James Khoury    schedule 16.04.2011
comment
Это вообще не срабатывает в IE9 - person Marcus Pope; 26.09.2012

Я был с той же проблемой, видел все виды решений и не работал.

Проведя некоторые тесты, я заметил, что $(window).resize, по крайней мере, в моем случае, срабатывает только с $(document).ready() перед ним. Не $(функция()); ни $(окно).ready();

Итак, мой код сейчас:

$(document).ready(function(){
  $(window).resize(function(){
      // refresh variables
      // Apply variables again
  });
});

...и даже работа по тревоге!

person Reitz    schedule 04.12.2013

Попробуйте этот код.

window.addEventListener("resize", function(){
    console.log('yeap worked for me!');
})
person Javohir Karimov    schedule 01.05.2020