【问题标题】:How to trigger the window resize event in JavaScript?如何在 JavaScript 中触发窗口调整大小事件?
【发布时间】:2010-12-21 13:37:05
【问题描述】:

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

我发现window.resizeTo()可以触发该功能,但有没有其他解决办法?

【问题讨论】:

    标签: javascript jquery events


    【解决方案1】:
    window.dispatchEvent(new Event('resize'));
    

    【讨论】:

    • 似乎适用于 Chrome、FF、Safari,但不适用于:IE!
    • jQuery 的trigger 实际上并没有触发原生的“resize”事件。它只触发使用 jQuery 添加的事件侦听器。就我而言,第 3 方库直接监听本地“调整大小”事件,这是对我有用的解决方案。
    • 伟大而简单的解决方案。虽然,我认为你应该添加一些代码来兼容 IE(据我所知,对于 IE,我们必须使用 window.fireEvent
    • 这不适用于我的所有设备。我不得不像这样触发事件: var evt = document.createEvent('UIEvents'); evt.initUIEvent('resize', true, false, window, 0); window.dispatchEvent(evt);
    • 在我的 IE11 中失败并显示“对象不支持此操作”
    【解决方案2】:

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

    window.onresize = doALoadOfStuff;
    
    function doALoadOfStuff() {
        //do a load of stuff
    }
    

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

    在您的现代浏览器中,您可以trigger the event 使用:

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

    这在 Internet Explorer 中不起作用,您必须在其中进行速记:

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

    jQuery has the trigger method,其工作原理如下:

    $(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);
    }
    

    【讨论】:

    • 您的匿名函数是不必要的。 window.onresize = doALoadOfStuff;另外,这并没有回答问题,下面皮诺松的答案是正确的答案。
    • Googler 的:看看@avetisk 的回答。
    • 解耦是个好主意,但在我/这种情况下,它不起作用。仅调用 resize 方法是行不通的,因为如果不触发窗口调整大小,则其他各种 div/容器将无法设置正确的高度。
    • @PandaWood - 那么我的最后一个例子对你来说更好。
    • 非常感激的伙伴。这真的很有帮助
    【解决方案3】:

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

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

    【讨论】:

    • 一个用例是当一个 jQuery 插件使用窗口调整大小事件来响应,但你有一个折叠的侧边栏。插件的容器会调整大小,但窗口不会。
    • 确实不需要 JQuery,但我更喜欢 JQuery 解决方案,因为我的产品广泛使用 JQuery。
    • wordpress 页面加载后会在哪里添加以调整其大小?
    • 这在最新的 Chrome 中不适合我,这个答案可以:stackoverflow.com/a/22638332/1296209
    • 这是我最初尝试的方法 - 它没有用,但 window.dispatchEvent(new Event('resize')); 做到了
    【解决方案4】:

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

    【讨论】:

    • 这是在不使用 jQuery 的情况下跨浏览器的好方法。
    • 不知道为什么这不是最佳答案......这比被接受的“非此即彼”的答案要好......
    【解决方案5】:

    一个也可以在 IE 上运行的纯 JS(来自@Manfred comment

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

    【讨论】:

    • 不幸的是,UIEvent.initUIEvent() 的文档说 Do not use this method anymore as it is deprecated. createEvent docs 说“许多与 createEvent 一起使用的方法,例如 initCustomEvent,都已弃用。请改用 event constructors。” This page 看起来很有希望用于 UI 事件。
    • 是的,但是 IE11 不支持new Event() 方法。我认为作为对旧浏览器的破解,您可以执行if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ } 之类的操作。当前方法是avetisk's answer
    • @pomber 感谢您的解决方案,实际上我试图触发自定义事件以调整窗口大小以调整图表大小...您的解决方案节省了我的时间
    【解决方案6】:

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

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

    【讨论】:

    • 今天在 Chrome 中工作。
    【解决方案7】:

    只是

    $(window).resize();
    

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

    【讨论】:

    • 而且即使你有 jQuery,它也只会触发与 jQuery 绑定的事件。
    【解决方案8】:

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

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

    【讨论】:

    • 在 Chrome 和 FF 中运行良好,但在 IE11 中无法运行
    • @Collins - 感谢您的更新,我以为我已经在 IE11 上验证了这一点...我会尝试稍后再更新,感谢您的反馈。
    【解决方案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" >..
    

    【讨论】:

      【解决方案10】:

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

      window.resizeBy(xDelta, yDelta)window.resizeBy(-200, -200) 一样调用以将页面缩小 200 像素 x 200 像素。

      【讨论】:

      • 为什么会被标记下来?不正确吗?它依赖于浏览器吗?
      • 这在 any 浏览器中不起作用:Chrome、Firefox、IE、Firefox 测试。
      • Firefox 7+,可能还有其他现代浏览器,在大多数情况下不再允许调用此方法。此外,实际调整窗口大小以触发事件是不可取的。
      • resizeBy() 和 resizeTo() 在最新的稳定版 Chrome 中都可以正常工作。 76.0
      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2010-10-13
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多