Какова наилучшая практика не переопределять другие связанные функции в window.onresize?

Сколько я копаю в JavaScript, я очень об этом спрашиваю. Например, у нас есть обработчик событий window.onresize, и если я говорю:

window.onresize = resize;

function resize()
{
  console.log("resize event detected!");
}

Не будет ли это убивать все другие функции, связанные с одним и тем же событием, и просто зарегистрировать мое сообщение в консоли?

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

Или меня полностью смущает его использование?

Ответ 1

Вы можете сохранить старую функцию onresize и вызвать ее до или после пользовательской функции изменения размера. Пример, который должен работать, будет примерно таким:

var oldResize = window.onresize;

function resize() {
    console.log("resize event detected!");
    if (typeof oldResize === 'function') {
        oldResize();
    }
}
window.onresize = resize;

Этот метод может иметь проблемы, если есть несколько функций onresize. Вы можете сохранить старую функцию onresize как часть закрытия и вызвать старую после вашей функции.

function addResizeEvent(func) {
    var oldResize = window.onresize;
    window.onresize = function () {
        func();
        if (typeof oldResize === 'function') {
            oldResize();
        }
    };
}

function foo() {
    console.log("resize foo event detected!");
}

function bar() {
    console.log("resize bar event detected!");
}
addResizeEvent(foo);
addResizeEvent(bar);

Когда вы вызываете addResizeEvent, вы передаете ему функцию, которую вы хотите зарегистрировать. Он принимает старую функцию изменения размера и сохраняет ее как oldResize. Когда произойдет изменение размера, он вызовет вашу функцию, а затем вызовет функцию старого изменения размера. Вы должны иметь возможность добавлять столько звонков, сколько захотите.

В этом примере при изменении размера окна он вызовет bar, затем foo, затем все, что было сохранено в window.resize(если было что-то).

Ответ 2

Вместо замены такого обработчика catch-all вы должны просто добавить DOM 2 прослушиватель следующим образом:

window.addEventListener("resize", myResizeFunction);

или более подробно:

if (window.addEventListener) {    // most non-IE browsers and IE9
   window.addEventListener("resize", myResizeFunction, false);
} else if (window.attachEvent) {  // Internet Explorer 5 or above
   window.attachEvent("onresize", myResizeFunction);
}

Ответ 3

Один из способов сделать это:

function resize() { /* ... */ }

var existing = window.onresize;
window.onresize = function() {
    if (existing) {
        existing();
    }
    resize();
 }

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

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

Это автоматически обрабатывает несколько обработчиков и прочее для вас.