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

发布于 2024-08-13 03:22:22 字数 129 浏览 2 评论 0原文

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

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

I have registered a trigger on window resize. I want to know how I can trigger the event to be called. For example, when hide a div, I want my trigger function to be called.

I found window.resizeTo() can trigger the function, but is there any other solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

动次打次papapa 2024-08-20 03:22:22
window.dispatchEvent(new Event('resize'));
window.dispatchEvent(new Event('resize'));
山人契 2024-08-20 03:22:22

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

window.onresize = doALoadOfStuff;

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

在此示例中,您可以调用 doALoadOfStuff 函数而不分派事件。

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

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

这在 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);
}

Where possible, I prefer to call the function rather than dispatch an event. This works well if you have control over the code you want to run, but see below for cases where you don't own the code.

window.onresize = doALoadOfStuff;

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

In this example, you can call the doALoadOfStuff function without dispatching an event.

In your modern browsers, you can trigger the event using:

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

This doesn't work in Internet Explorer, where you'll have to do the longhand:

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

jQuery has the trigger method, which works like this:

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

And has the caveat:

Although .trigger() simulates an event activation, complete with a synthesized event object, it does not perfectly replicate a naturally-occurring event.

You can also simulate events on a specific element...

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

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}
小…红帽 2024-08-20 03:22:22

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

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

With jQuery, you can try to call trigger:

$(window).trigger('resize');
待天淡蓝洁白时 2024-08-20 03:22:22

结合 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);
}

Combining pomber's and avetisk's answers to cover all browsers and not causing warnings:

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);
}
怼怹恏 2024-08-20 03:22:22

也适用于 IE 的纯 JS(来自 @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);
});

A pure JS that also works on IE (from @Manfred comment)

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

Or for angular:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});
欲拥i 2024-08-20 03:22:22

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

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

I wasn't actually able to get this to work with any of the above solutions. Once I bound the event with jQuery then it worked fine as below:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');
夏雨凉 2024-08-20 03:22:22

这就是

$(window).resize();

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

just

$(window).resize();

is what I use... unless I misunderstand what you're asking for.

_失温 2024-08-20 03:22:22

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

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

I believe this should work for all browsers:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);
淡笑忘祈一世凡恋 2024-08-20 03:22:22

用 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" >..

Response with RxJS

Say Like something in Angular

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

If manual subscription desired (Or Not Angular)

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

Since my intial startWith Value might be incorrect (dispatch for correction)

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

In say Angular (I could..)

<div class="iframe-container"  [style.height.px]="size$ | async" >..
耳钉梦 2024-08-20 03:22:22

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

window.resizeBy(xDelta, yDelta) 调用类似于 window.resizeBy(-200, -200) 将页面缩小 200px x 200px。

window.resizeBy() will trigger window's onresize event. This works in both Javascript or VBScript.

window.resizeBy(xDelta, yDelta) called like window.resizeBy(-200, -200) to shrink page 200px by 200px.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文