Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onresize выполняется дважды (https://javascript.ru/forum/events/42924-onresize-vypolnyaetsya-dvazhdy.html)

simple 14.11.2013 10:29

onresize выполняется дважды
 
Доброго дня, кто подскажет почему событие onresize вызывает обработчик 2 раза...:help:
window.onresize = function () {
    alert('resize'); //то же и с console.log и через addEventListener
};

нажимаю F11 или кнопку разворачивание окна и обработчик вызывается 2 раза. Браузер Chrome.

jsru_ 14.11.2013 11:06

это баг, срабатывает на начало и окончание, используй сеттаймаут

simple 14.11.2013 11:21

jsru_ спасибо, события onresizestart видимо в chrome нет? (

jsru_ 14.11.2013 11:25

simple, не встречал:)

simple 14.11.2013 15:39

да они только в IE похоже есть, еще вопрос по теме, может лучше тогда использовать систему флагов чем таймер?
var flag = true; // global variable;
window.onresize = function () {
    if (flag) {
        alert('resize');
        flag = false;
    } else flag = true;
};

что будет лучше для производительности?

simple 14.11.2013 15:45

мне кажется onresize автоматом срабатывает на событие keyup и mouseup вот и получается дублирование, вместо onresizestart и onresizeend, ну да ладно. :)

Deff 14.11.2013 19:25

simple, onresize процесс не одномоментный и ассинхронный (посколь перерендиваюца все элементы и по нескольку раз (рекурсивно) для внесения поправок) и при каждом изменении на пиксель может вызывать события

Борьба - мелкой задержкой(cрабатывает по окончании переходных режимов). Ранее в FF алерт в самой функции события( без подобной задержки) вообще вызывал крах браузера (где т в версии 12-13)

var timerId_0=false;
 window.onresize = function () {
 clearTimeout(timerId_0);
 timerId_0 = setTimeout(function () {
    alert('resize'); //то же и с console.log и через addEventListener
 },10)
};


Часовой пояс GMT +3, время: 18:11.