Почему IE8 зависает на событии jquery window.resize? - PullRequest
6 голосов
/ 10 мая 2011

Я обнаружил проблему, которая, кажется, всегда воспроизводится при открытии фрагмента html и javascript в IE8.

<html>
    <body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
    <script>
        $(document).ready(function(){
            $(window).resize(function() {
                console.log('Handler for .resize() called');
            });
        });
    </script>
    <div id="log">
    </div>
    </body>
</html>

Загрузка этого файла в IE8 и открытие Инструментов разработчика покажет, что сообщение журнала печатается непрерывнопосле одного изменения размера окна браузера.

У кого-нибудь есть идеи, почему?Этого не происходит ни в IE7, ни в IE9, ни в других браузерах (или, по крайней мере, в их последних версиях).

ОБНОВЛЕНИЕ

Одно решение для предотвращения непрерывного запуска изменения размера() - добавить обработчик для document.body.onresize, если браузер IE8.

 var ieVersion = getInternetExplorerVersion();
    if (ieVersion == 8) {
        document.body.onresize = function () {
        };
    }
    else {
        $(window).resize(function () {
        });
    }

Но это не отвечает на мой вопрос: является ли постоянное срабатывание resize () ошибкой в ​​IE8?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Если включено «показывать содержимое окна при перетаскивании», вы будете завалены событиями изменения размера. Я предполагаю, что вы тестируете IE8 на отдельном компьютере с Windows, у которого включен этот эффект (Свойства экрана -> Внешний вид -> Эффекты ...).

Чтобы противодействовать этому, вы можете обернуть и перехватить события изменения размера, чтобы приручить их: http://paulirish.com/demo/resize

В этой статье говорится, что Chrome, Safari и Opera тоже страдают от этого.

0 голосов
/ 09 ноября 2012

Я вижу проблему, которую вы описываете, только если размер элемента на странице изменен (, как описано в этом вопросе ). Ваш пример не работает для меня, но я предполагаю, что вы добавляете консольное сообщение в log div, который у вас там есть, что означает, что он изменяет размер div и вызывает событие изменения размера окна.

Ответ, который дал Ли, правильный, но метод в ссылке не сработал для меня. Вот что я сделал:

var handleResize = function(){
   $(window).one("resize", function() {
      console.log('Handler for .resize() called');
      setTimeout("handleResize()",100);
   });
}
handleResize();

Таким образом, обработчик освобождается, как только он запускается, и связывается только после того, как вы завершили все свои действия, которые могут повторно вызвать изменение размера страницы. Я добавил setTimeout, чтобы обеспечить дополнительное регулирование. Увеличьте значение, если ваши сценарии требуют больше времени.

...