考えられる解決策は 2 つあります。ウィンドウのサイズを初めて変更するときにハンドラーを実行する場合は、一度だけ実行するように強制できます。
$(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');
});
これにより、サイズ変更ハンドラーが 1 秒あたり最大 5 回実行されます。必要に応じて許容範囲を変更できます。
ただし、次の状況を考えてみてください: 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 ミリ秒です。これは、ウィンドウの幅をそれ以上再計算しないことを意味します。(必要に応じて削除または変更できます。) 画面の状態が変化した場合にのみ、高価なコードを実行します。これがあなたが探しているものかどうかはわかりませんが、要件が微妙に異なる場合は、創造的になる必要があります.