DOM onresize событие - PullRequest
       25

DOM onresize событие

22 голосов
/ 30 сентября 2009

Если у меня есть это

window.onresize = function() {
  alert('resized!!');
};

Моя функция запускается несколько раз в течение изменения размера, но я хочу зафиксировать завершение изменения размера. Это в IE.

Есть идеи? Существуют различные идеи, но пока они мне не помогли (например, предполагаемое событие IE window.onresizeend.)

Ответы [ 7 ]

30 голосов
/ 20 мая 2010

В этом случае я бы настоятельно предложил бы разобраться. Самый простой, эффективный и надежный способ сделать это в JavaScript, который я нашел, - это плагин Бен Алмана jQuery, Throttle / Debounce (может использоваться с или без jQuery - я знаю ... звучит странно ).

С помощью debouncing, код для этого будет прост:

$(window).resize($.debounce(1000, function() {
   // Handle your resize only once total, after a one second calm.
   ...
}));

Надеюсь, что это может кому-то помочь. ;)

7 голосов
/ 20 мая 2010

Я всегда использую это, когда хочу что-то сделать после изменения размера. Вызовы setTimeout и clearTimeout не оказывают заметного влияния на скорость изменения размера, поэтому не проблема, что они вызываются несколько раз.

var timeOut = null;
var func = function() { /* snip, onresize code here */};
window.onresize = function(){
   if(timeOut != null) clearTimeout(timeOut);
   timeOut = setTimeout(func, 100);
}
5 голосов
/ 01 октября 2009

Это не идеально , но оно должно дать вам необходимый старт.

var initialX = null;
var initialY = null;
var lastResize = null;
var waiting = false;
var first = true;
var id = 0;

function updateResizeTime()
{
    if (initialX === event.clientX && initialY === event.clientY)
    {
        return;
    }

    initialX = event.clientX;
    initialY = event.clientY;

    if (first)
    {
        first = false;
        return;
    }

    lastResize = new Date();            
    if (!waiting && id == 0)
    {
        waiting = true;
        id = setInterval(checkForResizeEnd, 1000);
    }
}

function checkForResizeEnd()
{
    if ((new Date()).getTime() - lastResize.getTime() >= 1000)
    {
        waiting = false;
        clearInterval(id);
        id = 0;
        alert('hey!');
    }
}

window.onresize = function()
{
    updateResizeTime();
}
4 голосов
/ 30 сентября 2009

Вы получаете несколько событий, потому что действительно есть несколько событий. Windows анимирует изменение размера, выполняя его несколько раз при перетаскивании окна (по-моему, вы можете изменить его в реестре).

Что вы можете сделать, это добавить задержку. Делайте clearTimeout, setTimout (myResize, 1000) каждый раз, когда происходит событие IE. Тогда только последний из них выполнит реальное изменение размера.

1 голос
/ 21 мая 2013

простое чистое решение javascript, просто измените значение 1000 int на меньшее, чтобы повысить скорость отклика

        var resizing = false;
        window.onresize = function() {
            if(resizing) return;
            console.log("resize");
            resizing = true;
            setTimeout(function() {resizing = false;}, 1000);
        };
1 голос
/ 12 марта 2012

Не уверен, что это может помочь, но так как кажется, что он работает отлично, вот оно. Я взял фрагмент из предыдущего поста и немного его изменил. Функция doCenter () сначала переводит px в em, а затем вычитает ширину объекта и делит остаток на 2. Результат присваивается в качестве левого поля. doCenter () выполняется для центрирования объекта. Тайм-аут срабатывает при изменении размера окна, снова выполняя doCenter ().

function doCenter() {
document.getElementById("menuWrapper").style.position = "fixed";
var getEM = (window.innerWidth * 0.063);
document.getElementById("menuWrapper").style.left = (getEM - 40) / 2 + "em";
}

doCenter();

var timeOut = null;
var func = function() {doCenter()};
window.onresize = function(){
    if (timeOut != null) clearTimeout(timeOut);
    timeOut = setTimeout(func, 100);
};
0 голосов
/ 06 июля 2011

Мне понравилось элегантное решение Pim Jager, хотя я думаю, что в конце есть лишняя пара, и я думаю, что, возможно, setTimeout должен быть "timeOut = setTimeout (func, 100);"

Вот моя версия с использованием Dojo (предполагается, что определена функция с именем demo_resize ()) ...

var _semaphorRS = null;
dojo.connect(window,"resize",function(){
 if (_semaphorRS != null) clearTimeout(_semaphorRS);
 _semaphorRS = setTimeout(demo_resize, 500);
 });

Примечание: в моей версии требуется конечный символ.

...