angular - 获取对当前事件的 HTMLElement 的引用

标签 angular typescript

所以我有一个 Angular 2 和 Typescript 项目,我想清除特定点击时页面上的所有焦点。

现在我只是使用 document.activeElement 获取当前事件的元素,然后对其调用 .blur()。然而,这在语义上是不正确的,当然 TypeScript 正在对此进行调整(这是理所当然的)。

有什么方法可以完成同样的事情,但要确保我引用的是 HTMLElement 而不是 Element 以便我可以正确输入内容?

基本上,当 A) 单击子导航并且单击的菜单项已经打开时,我调用一个函数来关闭所有子菜单,并且 B) 当在非菜单项的任何位置单击文档时。

这里是被调用的函数:

closeMenus = function(){
    for (var i=0, j=this.openElements.length; i<j; i++){
        this.openElements[i] = false;
    };

    document.activeElement.blur();
};

这给出了错误:

Property 'blur' does not exist on type 'Element'

绝对正确,它存在于 HTMLElement 上。但是,如果我添加这一行:

console.log(document.activeElement instanceof HTMLElement);

这返回真。所以我对 TypeScript 到底想要什么感到非常困惑?

最佳答案

文档的activeElement 可以是任何Element,而不仅仅是一个HTMLElement。在编译时,编译器不知道元素的类型。因此,如果您用 instanceof 检查包围调用,编译器就会知道 activeElement 必须是要执行的代码的 HTMLElement 并允许引用。

if (document.activeElement instanceof HTMLElement) {
  document.activeElement.blur();
}

这种方法不需要您跳过获取不同 Angular 绑定(bind)的步骤来执行您已经可用的方法。更少的代码和更少的依赖!

关于angular - 获取对当前事件的 HTMLElement 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40367713/

相关文章:

javascript - Angular 5 anchor 没有滚动

javascript - Angular 的 ngOnInit 和通过 Observable 返回记录的时间

arrays - typescript :为每个元素输入不同类型的数组

angular - Angular 中的 pipe() 函数是什么

angular - 使用 ionic/cordova 时出现意外的 token 错误

typescript - 如何清理 typescript 缓存?

angular - Ionic 3 网格无法将行项目垂直居中

angularjs - Angular 将回调函数作为 @Input 传递给子组件,类似于 AngularJS 方式

angular - 类型 'subscribe' 中的属性 'ObservableMedia' 不可分配给基本类型 'Subscribable<MediaChange>' 中的同一属性

angular - NGXS:如何测试一个 Action 是否被调度?