在调整元素大小之前和之后,我想做一些事情,我尝试绑定调整大小事件并且它有效:
$('#test_div').bind('resize', function(){
// do something
});
我发现了一些问题,但解决方案是timeout
,我不想使用timeout
。我只想立即处理 :)
另请参阅:
感谢任何建议 :)
在调整元素大小之前和之后,我想做一些事情,我尝试绑定调整大小事件并且它有效:
$('#test_div').bind('resize', function(){
// do something
});
我发现了一些问题,但解决方案是timeout
,我不想使用timeout
。我只想立即处理 :)
另请参阅:
感谢任何建议 :)
没有可以监听的调整大小结束事件。唯一的方法是等待一段短时间,直到没有更多的调整大小事件出现,才能知道用户何时完成调整大小。这就是为什么解决方案几乎总是涉及使用 setTimeout()
的原因,因为这是最好的方式来知道一段时间内是否有更多的调整大小事件。
我的先前回答侦听 .scroll()
事件,但这与 .resize()
完全相同的概念:More efficient way to handle $(window).scroll functions in jquery?,你可以像这样使用相同的概念调整大小:
var resizeTimer;
$(window).resize(function () {
if (resizeTimer) {
clearTimeout(resizeTimer); // clear any previous pending timer
}
// set new timer
resizeTimer = setTimeout(function() {
resizeTimer = null;
// put your resize logic here and it will only be called when
// there's been a pause in resize events
}, 500);
}
你可以尝试修改计时器的值为500
,以查看你喜欢的效果。数字越小,调用大小调整处理程序的速度就越快,但可能会被调用多次。数字越大,在触发之前暂停的时间就越长,但在同一用户操作期间不太可能多次触发。
如果你想在大小调整之前做一些事情,则必须在获得第一个大小调整事件时调用一个函数,然后在当前大小调整操作期间不再调用该函数。
var resizeTimer;
$(window).resize(function () {
if (resizeTimer) {
clearTimeout(resizeTimer); // clear any previous pending timer
} else {
// must be first resize event in a series
}
// set new timer
resizeTimer = setTimeout(function() {
resizeTimer = null;
// put your resize logic here and it will only be called when
// there's been a pause in resize events
}, 500);
}
timeout
可能是解决这个问题的唯一途径 :) - Rong Nguyenvar beforeAfterResize = [];
$(window).resize(function() {
var resizeInfo = Breakpoint.getActive();
if (beforeAfterResize.length > 1) {
beforeAfterResize[0] = beforeAfterResize[1];
beforeAfterResize[1] = resizeInfo;
} else {
beforeAfterResize.push(resizeInfo);
}
console.log(beforeAfterResize);
});
var fromMobile = false;
if ( (( beforeAfterResize[0] === "mobile" ) || ( beforeAfterResize[0] === "tablet" ))
&& (( beforeAfterResize[1] === "desktop" ) || ( beforeAfterResize[1] === "desktop-large" )) ) {
fromMobile = true;
}
让我知道这对你是否有效。
setTimeout
有什么问题? - Matthew Blancarte