有两种可能的解决方案。如果您希望处理程序在您第一次调整窗口大小时运行,您可以强制它只运行一次:
$(window).one('resize', function () {
if ($(window).width() < 500) console.log('Small');
});
但是你有一个问题:它实际上只运行一次。如果他们再次将其调整为大会发生什么?
一种解决方案是引入一个“容差”区域,仅当窗口在特定时间段内调整大小时才运行代码:
var RESIZE_TOLERANCE = 200; // milliseconds
var last_resize = 0;
$(window).resize(function () {
var current_time = (new Date()).getTime();
if (current_time - last_resize < RESIZE_TOLERANCE) {
return; // stop
}
last_resize = current_time;
if ($(window).width() < 500) console.log('Small');
});
这会强制调整大小处理程序每秒最多运行五次。如果您愿意,可以更改容差。
然而,想想这种情况:我们从 999px 调整到 998px,触发调整大小处理程序。然后我们在 200ms 结束之前从 998px 调整到 200px。问题是我们错过了调整大小事件。
一个更好的解决方案是跟踪当前的小状态,并且仅在状态发生变化时才执行繁重的代码:
var RESIZE_TOLERANCE = 100; // milliseconds
var SMALL_TOLERANCE = 500; // pixels
var last_resize = 0;
var small = $(window).width() < SMALL_TOLERANCE;
$(window).resize(function () {
var current_time = (new Date()).getTime();
if (current_time - last_resize < RESIZE_TOLERANCE) {
return; // stop
}
last_resize = current_time;
var is_small = $(window).width() < SMALL_TOLERANCE;
if (is_small !== small) {
// run expensive code here
small = is_small;
}
});
现在容差是 100 毫秒,这意味着我们不会重新计算窗口的宽度。(如果需要,您可以删除或更改它。)我们仅在屏幕状态发生更改时才运行昂贵的代码。我不知道这是否是您正在寻找的,但是如果您的要求略有不同,您将必须具有创造性。