Профессиональные курсы: Практика верстки HTML JavaScript для начинающих Программирование на PHP Онлайн-курсы по веб-технологиям

Об осле и ресайзе

Одна из часто используемых юзерами возможностей — изменение размера окна браузера. При этом не все элементы на странице удается удачно масштабировать с помощью HTML/CSS и что-то приходится делать скриптами.

Для этого у объекта window существует событие resize, навесив на которое обработчик, можно динамически откликаться на действия пользователей. И всё было бы замечательно, если не осел поведение браузера Internet Explorer.

Дело в том, что когда вы хватаетесь за границу браузера и изменяете размеры окна, в большинстве браузеров событие resize возникает только по фактическому завершению ресайза. То есть пока вы тащите край страницы, ничего не происходит. ИМХО, правильнее, конечно, такое поведение привязать к событию resizeend, но мы имеем то что имеем.

IE напротив реагирует на ресайз сразу же во время перемещения, непрерывно вызывая функцию обработчик. Можно легко убедится в этом, запустив такой простой пример:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Test</title>
    <script type="text/javascript">
    window.onresize = function() {
        document.body.innerHTML = Math.random();
    }
    </script>
</head>
<body></body>
</html>

Практика написания различных JavaScript-сценариев показывает, что поведение, выбранное стандартными браузерами, хоть и не отвечает названию события resize, является более удобным. Например, если обработчик вызывает ресурсоемкий скрипт, в корне перестраивающий страницу, то простой ресайз в ИЕ вызовет его пару десятков раз, и всё благополучно зависнет на пару минут. Чтобы привести поведение при ресайзе в IE к стандартной схеме, можно сделать "ход конем" с помощью таймеров. Предлагается такое решение:

var resizeTimer = null;
var resizeInterval = 100;
window.onresize = function() {
    if (resizeTimer != null) {
        clearTimeout(resizeTimer);
        resizeTimer = null;
    }
    resizeTimer = setTimeout("resizeHandler()", resizeInterval);
}
function resizeHandler() {
    document.body.innerHTML = Math.random();
}

Изменяя значение переменной resizeInterval, можно добится наиболее удобного поведения при ресайзе. Кстати, вместо window.onresize лучше использовать функцию добавления обработчиков событий.

Александр Бурцев 26 сентября 2008

Все права на статью "Об осле и ресайзе" принадлежат webew.ru.

Комментарии

SelenIT 3 ноября 2008, 21:18 #
Если я не ошибаюсь, на это поведение IE влияет системная настройка "Отображать содержимое окна при его перетаскивании" — если она выключена, он ведет себя "как все нормальные люди". Хотя, конечно, просить всех пользователей найти и выключить у себя эту настройку — не вариант...
 
Bur 5 ноября 2008, 11:33 #
Спасибо. Информация полезная, но разрабтчикам к сожалению не поможет...
 
 
Rambler's Top100 Flede HTML valid CSS valid