【问题标题】:How to trigger resize event in typescript如何在打字稿中触发调整大小事件
【发布时间】:2021-08-04 11:37:01
【问题描述】:

我试图在我的 Angular 应用程序中触发调整大小事件,但它不起作用。得到类似的错误

“UIEvent”类型上不存在属性“initUIEvent”。你的意思是 'initEvent'?

我不知道为什么会收到此错误。如何解决这个问题?

app.component.ts:

  trigger() {
     if (typeof Event === 'function') {
     window.dispatchEvent(new Event('resize'));
  } else {
  var resizeEvent = window.document.createEvent('UIEvents');
  resizeEvent.initUIEvent('resize', true, false, window, 0);
  window.dispatchEvent(resizeEvent);
  }
 }

演示:https://stackblitz.com/edit/angular-vnx4mq?file=src%2Fapp%2Fapp.component.ts

【问题讨论】:

  • 你用的是什么浏览器?您的示例笔在 Chrome、Firefox、Safari 和最新的 IE 中运行良好。
  • @tao: 正在检查所有浏览器..like chrome, firefox, Safari, IE
  • 您似乎误读了我的问题:它应该是:“您使用的是什么浏览器当您收到错误时?”
  • 他们告诉你@tao
  • @tao: else 条件代码在 chrome firefox 和 IE 中不起作用

标签: javascript angular typescript


【解决方案1】:

这就是你所需要的。广泛支持。

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

如果您有在页面上调整大小的对象,并且它们不在窗口调整大小事件中以执行其任务,则不会触及这些元素。

【讨论】:

  • window.onresize = () => { } 应该包含在调整大小时更新的函数。不幸的是,在这种情况下,强制调整大小与 requestAnimationFrame 策略冲突。如果您需要强制调整大小,请不要在超时时调用它,这是不合适的。
  • 知道当浏览器失去焦点时,这些计时器不会按照它们应该的方式更新。此 RAF 将使整个进程空闲到 1 FPS,您可以绕过它,因为它会导致非常无响应的编码实践。 :)
【解决方案2】:

订阅调整大小的更简单方法是使用fromEventof rxjs 运算符

fromEvent(window, 'resize').pipe(
  debounceTime(200)
).subscribe(() => {
  ...your code here...
})

您可以在单击按钮后在 ngOnInit 或函数中使用:

  tigger(){
    fromEvent(window, 'resize')
      .pipe(debounceTime(200))
      .subscribe(event => {
        console.log('size changed.', event);
      });

  }
  //or
  ngOnInit() {
    fromEvent(window, 'resize')
      .pipe(debounceTime(200))
      .subscribe(event => {
        console.log('size changed.', event);
      });
  }

啊!,如果你不放入app.component,别忘了取消订阅 见stackblitz

注意:我添加了一个 debounceTime 以不执行“每次”

【讨论】:

猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2015-03-27
  • 2015-03-06
相关资源
最近更新 更多