如果我有这个
window.onresize = function() {
alert('resized!!');
};
我的函数在整个调整大小时多次被激活,但我想捕获调整大小的完成。这是在IE中。
有什么想法吗?那里有各种各样的想法,但到目前为止对我没有用(例如IE的假设window.onresizeend事件。)
答案 0 :(得分:30)
在这种情况下,我会强烈建议去抖动。我在JavaScript中找到的最简单,最有效,最可靠的方法是Ben Alman's jQuery plugin, Throttle/Debounce(可以使用或不使用jQuery - 我知道......听起来很奇怪)。
通过去抖动,执行此操作的代码将非常简单:
$(window).resize($.debounce(1000, function() {
// Handle your resize only once total, after a one second calm.
...
}));
希望能帮助别人。 ;)
答案 1 :(得分:7)
当我想在调整大小后做某事时,我总是使用它。对setTimeout
和clearTimeout
的调用对调整大小的速度没有任何明显的影响,因此多次调用它们并不是问题。
var timeOut = null;
var func = function() { /* snip, onresize code here */};
window.onresize = function(){
if(timeOut != null) clearTimeout(timeOut);
timeOut = setTimeout(func, 100);
}
答案 2 :(得分:5)
不完美但它应该为您提供所需的开始。
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();
}
答案 3 :(得分:4)
您会收到多个事件,因为确实存在多个事件。通过在拖动窗口时多次执行调整大小动画(默认情况下,您可以在注册表中更改它)。
你可以做的是增加延迟。每次IE事件触发时都执行clearTimeout,setTimout(myResize,1000)。然后,只有最后一个将执行实际调整大小。
答案 4 :(得分:1)
不确定这是否有帮助,但由于它似乎工作得很好,所以在这里。 我从上一篇文章中获取了片段并略微修改了它。函数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);
};
答案 5 :(得分:1)
简单的纯JavaScript解决方案,只需将1000 int值更改为更低的响应性
var resizing = false;
window.onresize = function() {
if(resizing) return;
console.log("resize");
resizing = true;
setTimeout(function() {resizing = false;}, 1000);
};
答案 6 :(得分:0)
我喜欢Pim Jager的优雅解决方案,虽然我认为最后有一个额外的paren,我想也许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); });
注意:在我的版本中需要跟踪paren。