Подтвердить что ты не робот

DOM onresize event

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

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

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

Любые идеи? Есть разные идеи, но до сих пор не работал у меня (например, IE предположил событие window.onresizeend.)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Мне понравилось элегантное решение 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);
 });

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