JavaScript 窗口大小调整事件

IT技术 javascript window-resize
2021-01-26 08:42:40

如何挂钩浏览器窗口大小调整事件?

一种 jQuery 方式来侦听调整大小事件,但我不希望仅将它带入我的项目中来满足这一要求。

6个回答

最佳做法是附加到调整大小事件。

window.addEventListener('resize', function(event) {
    ...
}, true);

jQuery 只是包装标准的resizeDOM 事件,例如。

window.onresize = function(event) {
    ...
};

jQuery可能会做一些工作以确保 resize 事件在所有浏览器中一致触发,但我不确定是否有任何浏览器不同,但我鼓励您在 Firefox、Safari 和 IE 中进行测试。

@SubOne 一个完美的例子,说明人们永远不应该这样做。
2021-03-13 08:42:40
此方法的一个潜在问题是您正在覆盖事件,因此您无法将多个操作附加到一个事件。addEventListener/attachEvent 组合是让您的 javascript 与可能在页面上执行的任何其他脚本友好的最佳方式。
2021-03-18 08:42:40
var onresize = window.onresize; window.onresize = function(event) { if (typeof onresize === 'function') onresize(); /** ... */ }
2021-03-19 08:42:40
window.addEventListener('resize', function(){}, true);
2021-03-20 08:42:40
ECMAScript 6window.onresize = () => { /* code */ };或更好:window.addEventListener('resize', () => { /* code */ });
2021-03-23 08:42:40

首先,我知道addEventListener上面的评论中已经提到了方法,但是我没有看到任何代码。由于这是首选方法,因此它是:

window.addEventListener('resize', function(event){
  // do stuff here
});

这是一个工作示例

我认为 Stijn de Witt 和 quemeful 的回答都是真实的。有时您关心删除事件侦听器,但在您不关心的情况下,像上面的示例中那样添加所有额外的代码是不必要的,并且可能会膨胀和降低可读性。在我看来,如果您没有想到需要删除侦听器的理由,那么这种方法是最好的解决方案。如有必要,您可以随时重写它。根据我的经验,这些需求只出现在特定情况下。
2021-03-19 08:42:40
听起来是最好的答案,因为您没有覆盖 window.onresize 事件:-)
2021-03-23 08:42:40
这是最直接的答案。
2021-03-29 08:42:40
许多人像您在此示例中所做的那样添加匿名事件侦听器,但这并不是一个很好的做法,因为这种方法使得以后无法删除这些侦听器。这曾经是没有问题的,因为无论如何网页都是短暂的,但在这个 AJAX、RIA 和 SPA 的时代,它正在成为一体。我们需要一种管理事件侦听器生命周期的方法。因此,最好将侦听器函数分解为一个单独的函数,以便以后可以使用removeEventListener.
2021-03-30 08:42:40
为什么不能每个人都像这样没有毛茸茸的回答
2021-03-31 08:42:40

永远不要覆盖 window.onresize 函数。

相反,创建一个函数来向对象或元素添加事件侦听器。这会检查并防止侦听器不起作用,然后作为最后的手段覆盖对象的功能。这是 jQuery 等库中使用的首选方法。

object:元素或窗口对象
type:调整大小,滚动(事件类型)
callback:函数引用

var addEvent = function(object, type, callback) {
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } else if (object.attachEvent) {
        object.attachEvent("on" + type, callback);
    } else {
        object["on"+type] = callback;
    }
};

然后使用是这样的:

addEvent(window, "resize", function_reference);

或使用匿名函数:

addEvent(window, "resize", function(event) {
  console.log('resized');
});
哈,所有额外的空检查是什么?试图在 IE 4.5 或其他东西中工作?
2021-03-14 08:42:40
小心elem == undefined. 有可能(虽然不太可能)“未定义”在本地被定义为其他东西。stackoverflow.com/questions/8175673/...
2021-03-20 08:42:40
您想知道如何调用此函数来接收窗口大小调整事件?方法如下: addEvent(window, "resize", function_reference); :)
2021-03-25 08:42:40
请注意,从 IE 11 开始,attachEvent不再支持。未来的首选方式是addEventListener
2021-03-28 08:42:40
这应该是公认的答案。覆盖 onresize 只是不好的做法。
2021-04-01 08:42:40

永远不应该直接使用 resize 事件,因为它会在我们调整大小时连续触发。

使用去抖动功能来减轻多余的调用。

window.addEventListener('resize',debounce(handler, delay, immediate),false);

这是一个常见的在网上漂浮的去抖动,尽管在 lodash 中寻找更高级的去抖动。

const debounce = (func, wait, immediate) => {
    var timeout;
    return () => {
        const context = this, args = arguments;
        const later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

这可以像这样使用......

window.addEventListener('resize', debounce(() => console.log('hello'),
200, false), false);

它永远不会每 200 毫秒触发一次以上。

对于移动方向更改,请使用:

window.addEventListener('orientationchange', () => console.log('hello'), false);

这是我整理的一个小图书馆,用来巧妙地处理这个问题。

很好的答案,需要解决调整大小的性能问题!去抖动是一种选择,另一种是简单的节流(如果您需要在“步骤”中调整 UI 的大小,这可能是可行的方法)。有关示例,请参见bencentra.com/code/2015/02/27/optimizing-window-resize.html
2021-03-16 08:42:40
我完全清楚,那个片段不是我的代码,它只是一个例子。
2021-03-22 08:42:40
我很欣赏以下信息:去抖动(尽管我以前拒绝以这种方式使用超时,但现在它似乎是一个非常宝贵的概念/功能)、lodash(尽管我个人不相信)以及解决关于是否使用 addEvent 作为后备的歧义添加事件侦听器(仅因为较旧的答案并未真正明确解决有关此问题的评论)
2021-03-28 08:42:40
仅供参考,因为您使用的是 ES6 箭头函数表示法,内部函数需要具有(...arguments) => {...}(或...args为了减少混淆),因为arguments变量不再可用其作用域。
2021-04-05 08:42:40

2018+ 解决方案:

您应该使用ResizeObserver它是一种浏览器原生解决方案,其性能比使用resize事件要好得多此外,它不仅支持 上的事件,document支持任意elements.

var ro = new ResizeObserver( entries => {
  for (let entry of entries) {
    const cr = entry.contentRect;
    console.log('Element:', entry.target);
    console.log(`Element size: ${cr.width}px x ${cr.height}px`);
    console.log(`Element padding: ${cr.top}px ; ${cr.left}px`);
  }
});

// Observe one or multiple elements
ro.observe(someElement);

目前,Firefox、Chrome、Safari 和 Edge 支持它对于其他(和较旧的)浏览器,您必须使用polyfill