DOM onresize событие

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

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

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

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

7 ответов

Решение

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

С debouncing, код для этого будет так просто:

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

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

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

var timeOut = null;
var func = function() { /* snip, onresize code here */};
window.onresize = function(){
   if(timeOut != null) clearTimeout(timeOut);
   timeOut = setTimeout(func, 100);
}

Это не идеально, но это должно дать вам старт, который вам нужен.

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();
}

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

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

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

        var resizing = false;
        window.onresize = function() {
            if(resizing) return;
            console.log("resize");
            resizing = true;
            setTimeout(function() {resizing = false;}, 1000);
        };

Не уверен, что это могло бы помочь, но так как это, кажется, работает отлично, вот оно. Я взял фрагмент из предыдущего поста и немного изменил его. Функция 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);
};

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

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

var _semaphorRS = null;
dojo.connect (окно,"размер", функция (){
 if (_semaphorRS!= null) clearTimeout(_semaphorRS);
 _semaphorRS = setTimeout(demo_resize, 500);
 });

Примечание: в моей версии конечный паренат необходим.

Другие вопросы по тегам