使用 JavaScript 检测窗口何时调整大小?

IT技术 javascript jquery
2021-01-14 20:58:10

当用户结束调整浏览器窗口大小时,jQuery 或 JavaScript 有什么方法可以触发一个函数?

换句话说:

  1. 当用户调整浏览器窗口大小时,我可以检测鼠标向上事件吗?否则:
  2. 我可以检测窗口调整大小操作何时完成吗?

我目前只能在用户开始使用 jQuery 调整窗口大小时触发事件

4个回答

.resize()每次宽度/高度实际发生变化时,您都可以使用get ,如下所示:

$(window).resize(function() {
  //resize just happened, pixels changed
});

您可以在此处查看工作演示,它采用新的高度/宽度值并在页面中更新它们以供您查看。记住事件并没有真正开始结束,它只是在发生调整大小时“发生”......没有什么可以说另一个不会发生的。


编辑:通过评论,您似乎想要一个“on-end”事件,您找到的解决方案可以做到这一点,但有一些例外(您无法以跨浏览器的方式区分鼠标悬停和暂停,同为一个Vs的停顿)。不过,您可以创建该事件,使其更简洁,如下所示:

$(window).resize(function() {
    if(this.resizeTO) clearTimeout(this.resizeTO);
    this.resizeTO = setTimeout(function() {
        $(this).trigger('resizeEnd');
    }, 500);
});

你可以把它作为一个基本文件放在某个地方,无论你想做什么……然后你就可以绑定到resizeEnd你正在触发的事件,就像这样:

$(window).bind('resizeEnd', function() {
    //do something, window hasn't changed size in 500ms
});

你可以在这里看到这种方法的工作演示

@Nick:是的,quirksmode 页面只涵盖 FF 直到 3.1b2 - 但那种显示,它取决于浏览器......
2021-03-15 20:58:10
@chris_l:我不知道那个页面有多准确了……打开我在最新版 Firefox 中发布的演示,每次大小改变时它都会触发它。我没有要测试的 Opera,它可能仍然不同,但它们至少比 quirksmode 建议的更一致,我会向他们发送需要更新的说明。
2021-03-16 20:58:10
我只是想顺便说一下,当用户在移动设备上放大页面时也会触发。
2021-03-23 20:58:10
这取决于浏览器,触发调整大小事件的时间和数量:quirksmode.org/dom/events/resize.html
2021-03-31 20:58:10
window.addEventListener('resize', function(){}, true);
2021-04-07 20:58:10

仅使用 JavaScript 的另一种方法是:

window.addEventListener('resize', functionName);

每次大小改变时都会触发,就像另一个答案一样。

functionName 是调整窗口大小时正在执行的函数的名称(末尾的括号不是必需的)。

这可以通过实现在onResize的GlobalEventHandlers接口的属性在JavaScript中,通过分配功能的onResize受到财产,就像这样:

window.onresize = functionRef;

下面的代码片段演示了这一点,通过控制台在窗口调整大小时记录窗口的内宽度和内高度。(在调整窗口大小后触发调整大小事件)

function resize() {
  console.log("height: ", window.innerHeight, "px");
  console.log("width: ", window.innerWidth, "px");
}

window.onresize = resize;
<p>In order for this code snippet to work as intended, you will need to either shrink your browser window down to the size of this code snippet, or fullscreen this code snippet and resize from there.</p>

如果您只想在滚动结束时检查,在 Vanilla JS 中,您可以想出这样的解决方案:

超级超级紧凑

var t
window.onresize = () => { clearTimeout(t) t = setTimeout(() => { resEnded() }, 500) }
function resEnded() { console.log('ended') }

所有 3 种可能的组合(ES6)

var t
window.onresize = () => {
    resizing(this, this.innerWidth, this.innerHeight) //1
    if (typeof t == 'undefined') resStarted() //2
    clearTimeout(t); t = setTimeout(() => { t = undefined; resEnded() }, 500) //3
}

function resizing(target, w, h) {
    console.log(`Youre resizing: width ${w} height ${h}`)
}    
function resStarted() { 
    console.log('Resize Started') 
}
function resEnded() { 
    console.log('Resize Ended') 
}