如何在JavaScript中触发窗口调整大小事件?

How to trigger the window resize event in JavaScript?

提问人:zhongshu 提问时间:11/30/2009 最后编辑:Shaun Roseltzhongshu 更新时间:11/10/2023 访问量:579883

问:

我已经注册了窗口大小调整的触发器。我想知道如何触发要调用的事件。例如,当隐藏一个 div 时,我希望调用我的触发器函数。

我发现可以触发该功能,但还有其他解决方案吗?window.resizeTo()

JavaScript jQuery 事件 onresize

评论


答:

488赞 Fenton 11/30/2009 #1

在可能的情况下,我更喜欢调用函数而不是调度事件。如果您可以控制要运行的代码,则此方法非常有效,但有关您不拥有代码的情况,请参阅下文。

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}

在此示例中,可以在不调度事件的情况下调用该函数。doALoadOfStuff

在现代浏览器中,您可以使用以下命令触发事件

window.dispatchEvent(new Event('resize'));

这在 Internet Explorer 中不起作用,您必须在 Internet Explorer 中执行长手操作:

var resizeEvent = window.document.createEvent('UIEvents'); 
resizeEvent.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(resizeEvent);

jQuery有触发器方法,其工作原理如下:

$(window).trigger('resize');

并有警告:

尽管模拟了事件激活,并完成了合成的事件对象,但它并不能完美地复制自然发生的事件。.trigger()

您还可以模拟特定元素上的事件...

function simulateClick(id) {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

评论

6赞 Dennis Plucinik 9/6/2013
您的匿名功能是不必要的。window.onresize = doALoadOfStuff;另外,这并不能回答问题,下面的pinouchon的答案是正确答案。
44赞 Fabian Lauer 10/17/2015
谷歌r:看看@avetisk的答案。
1赞 PandaWood 6/10/2016
解耦是个好主意,但在我/这种情况下,它不起作用。仅调用 resize 方法不起作用,因为如果没有触发窗口调整大小,其他各种 div/容器将无法设置正确的高度。
0赞 Fenton 6/10/2016
@PandaWood - 那么我的最后一个例子在你的情况下更好。
1赞 Desper 5/7/2021
非常有义务的伴侣。这真的很有帮助
160赞 Benjamin Crouzier 4/12/2013 #2

使用 jQuery,您可以尝试调用 trigger

$(window).trigger('resize');

评论

3赞 isherwood 10/16/2014
一个用例是,当jQuery插件使用窗口调整大小事件来响应时,但您有一个折叠的侧边栏。插件的容器会调整大小,但窗口不会。
4赞 Sri 5/16/2015
确实不需要 JQuery,但我更喜欢 JQuery 解决方案,因为我的产品广泛使用 JQuery。
0赞 SAHM 8/18/2016
加载后,将在哪里添加此内容以调整 wordpress 页面的大小?
0赞 webaholik 9/16/2018
这在最新的 Chrome 中对我不起作用,这个答案确实如此:stackoverflow.com/a/22638332/1296209
3赞 user2682863 12/6/2019
这就是我最初尝试的——它没有用,但确实有用window.dispatchEvent(new Event('resize'));
835赞 avetisk 9/9/2013 #3
window.dispatchEvent(new Event('resize'));

评论

12赞 Davem M 3/19/2014
似乎适用于 Chrome、FF、Safari,但不适用于:IE !
16赞 chowey 5/27/2014
jQuery实际上并没有触发本机的“resize”事件。它仅触发已使用 jQuery 添加的事件侦听器。就我而言,第三方库直接监听本机“调整大小”事件,这是对我有用的解决方案。trigger
2赞 Victor 4/1/2015
伟大而简单的解决方案。虽然,我认为您应该添加一些代码以实现 IE 兼容性(据我所知,对于 IE,我们必须使用window.fireEvent)
37赞 Manfred 6/16/2015
这对我来说并非在所有设备上都有效。我必须像这样触发事件: var evt = document.createEvent('UIEvents');evt.initUIEvent('调整大小', true, false, window, 0);window.dispatchEvent(evt);
21赞 pomber 8/9/2015
它在我的 IE11 中失败并显示“对象不支持此操作”
-2赞 T.O. 3/23/2014 #4

window.resizeBy()将触发窗口的 onresize 事件。这适用于 JavascriptVBScript

window.resizeBy(xDelta, yDelta)调用 Like 将页面缩小 200px 200px。window.resizeBy(-200, -200)

评论

3赞 Peter Wone 5/4/2014
为什么会降低这个分数?这是不正确的吗?它是否依赖于浏览器?
3赞 fregante 9/26/2015
这不适用于任何浏览器:Chrome、Firefox、IE、Firefox。
1赞 user247702 8/10/2016
在大多数情况下,Firefox 7+,可能还有其他现代浏览器,不再允许调用此方法。此外,为了触发事件而实际调整窗口大小是不可取的。
0赞 VanagaS 9/21/2019
resizeBy() 和 resizeTo() 在最新的稳定版 Chrome 76.0 中都可以正常工作
15赞 BBQ Singular 3/25/2014 #5

我实际上无法将其与上述任何解决方案一起使用。一旦我用jQuery绑定了事件,它就可以正常工作,如下所示:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');

评论

0赞 webaholik 9/15/2018
现在在 Chrome 中工作。
9赞 Matt Sich 12/18/2014 #6

$(window).resize();

是我用的...除非我误解了你的要求。

评论

4赞 adamdport 8/12/2016
即使你有 jQuery,它也只会触发与 jQuery 绑定的事件。
54赞 pomber 8/9/2015 #7

一个纯 JS,也适用于 IE(来自@Manfred评论)

var evt = window.document.createEvent('UIEvents'); 
evt.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(evt);

或者对于角度:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});

评论

4赞 Racing Tadpole 12/3/2015
不幸的是,UIEvent.initUIEvent() 的文档说 createEvent 文档说:“许多与 createEvent 一起使用的方法,例如 initCustomEvent,已被弃用。请改用事件构造函数此页面看起来很有希望进行 UI 事件。Do not use this method anymore as it is deprecated.
9赞 BrianS 1/20/2016
没错,但 IE11 不支持该方法。我认为作为针对旧浏览器的黑客,您可以做类似.其中当前方法是 avetisk 的答案new Event()if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }
0赞 Dinesh Gopal Chand 2/15/2019
@pomber感谢您的解决方案,实际上我正在尝试触发窗口大小调整的自定义事件以调整我的图表大小......您的解决方案拯救了我的一天
72赞 pfirpfel 5/8/2017 #8

结合 pomber 和 avetisk 的答案以涵盖所有浏览器并且不引起警告:

if (typeof(Event) === 'function') {
  // modern browsers
  window.dispatchEvent(new Event('resize'));
} else {
  // for IE and other old browsers
  // causes deprecation warning on modern browsers
  var evt = window.document.createEvent('UIEvents'); 
  evt.initUIEvent('resize', true, false, window, 0); 
  window.dispatchEvent(evt);
}

评论

1赞 kgx 1/12/2018
这是在不使用 jQuery 的情况下跨浏览器执行此操作的好方法。
0赞 SPillai 11/1/2018
不知道为什么这不是最好的答案......这比被接受的“非此即彼”的答案要好。
0赞 Sergio Wilson 7/20/2019 #9

使用 RxJS 的响应

在 Angular 中说像什么

size$: Observable<number> = fromEvent(window, 'resize').pipe(
            debounceTime(250),
            throttleTime(300),
            mergeMap(() => of(document.body.clientHeight)),
            distinctUntilChanged(),
            startWith(document.body.clientHeight),
          );

如果需要手动订阅(或不需要 Angular)

this.size$.subscribe((g) => {
      console.log('clientHeight', g);
    })

由于我的初始 startWith 值可能不正确(发送更正)

window.dispatchEvent(new Event('resize'));

比如说 Angular(我可以......

<div class="iframe-container"  [style.height.px]="size$ | async" >..
2赞 webaholik 8/15/2019 #10

我相信这应该适用于所有浏览器:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);

评论

0赞 Collins 3/30/2020
在 Chrome 和 FF 中效果很好,但在 IE11 中不起作用
0赞 webaholik 3/30/2020
@Collins - 感谢您的更新,以为我已经在 IE11 上验证了这一点......我稍后会尝试花一些时间来更新它,感谢您的反馈。