angular - `@HostListener` 的 `e: TouchEvent` 导致 Firefox 崩溃 "ReferenceError: TouchEvent is not defined."

标签 angular firefox touch-event

@HostListener 与明确键入为 TouchEvent 的事件参数一起使用,会导致 Firefox 崩溃并显示以下错误消息:

ReferenceError: TouchEvent is not defined.

一个例子:

@HostListener('touchstart', ['$event']) // or 'touchend', 'touchmove'
onTouchStart(e: TouchEvent): void {}

我自己可以想出一些方法来防止这种情况发生:

  • 使用e: TouchEvent | anye: any (或者根本不指定类型)
  • 使用 elRef.nativeElement.addEventListener('touchstart', (e: TouchEvent) => {})
  • 使用 Observable.fromEvent(elRef.nativeElement, 'touchstart').subscribe((e: TouchEvent) => {})

但使用any| any 看起来像是 hack,其他两个选项没有利用该框架。 有没有其他更好、更安全的方法来处理这个问题,如果没有,哪个选项更可取?

(也许有人还可以解释 Angular 实际上在做什么,以及为什么只有当事件被显式键入为 TouchEvent 时才会发生此错误...)


编辑:这个问题在 Angular 7 中仍然存在。 编辑:这个问题显然已在 Angular 6 中得到修复。

最佳答案

当方法上有装饰器时,typescript 编译器将参数类型存储在元数据中,这在桌面 Firefox 中失败,因为那里没有定义 TouchEvent。它可以通过用 stub 填充缺失的类型来解决。只需将以下代码添加到 polyfills.ts

for (const type of ['TouchEvent']) {
    if (typeof window[type] === 'undefined') {
        window[type] = function () { };
    }
}

要填充其他类型,请将它们添加到列表中。一句警告 - 这可能会破坏通过检测 window.TouchEvent 检查是否存在触摸事件的代码。

无论如何,这个问题似乎只发生在 JIT 编译器上,所以它可能会随着 Ivy 消失。

关于angular - `@HostListener` 的 `e: TouchEvent` 导致 Firefox 崩溃 "ReferenceError: TouchEvent is not defined.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51124242/

相关文章:

angular - 创建下拉组件

Angular Material 5 - 在 Mat 列表中显示全文(Word Wrap)

javascript - 调试:是否可以实时查看JS变量的值?

Android - 从 onTouchEvent() 访问成员变量

android - 如何在触摸屏幕时使圆圈变大(Android)?

javascript - @Input 属性没有被第二次更新

javascript - 如何将值从服务传递到组件的方法

javascript - 显示/隐藏 disqus 按钮不能与 firefox 一起正常工作

java - Firefox - org.openqa.selenium.interactions.MoveTargetOutOfBoundsException

android - 处理触摸事件 - onInterceptTouchEvent 和 onTouchEvent