DOM onresize event
Если у меня есть этот
window.onresize = function() {
alert('resized!!');
};
Моя функция запускается несколько раз во время изменения размера, но я хочу зафиксировать завершение изменения размера. Это в IE.
Любые идеи? Есть разные идеи, но до сих пор не работал у меня (например, IE предположил событие window.onresizeend.)
Ответы
Ответ 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.