繁体   English   中英

动态创建的元素上的addEventListener不起作用

[英]addEventListener on dynamically created elements not working

我想向内部html中存在的图像添加点击事件。 但是,当我尝试添加它时,它将无法正常工作。

模板

<div [innerHTML]="myHtml"></div>

myHtml;

ngOnInit() {
    const root = document.createElement('div');
    root.innerHTML = this.getHtml();
    const images = root.getElementsByTagName('img');
    Array.prototype.forEach.call(images, (image: HTMLImageElement, i) => {
      image.addEventListener('click', (event: any) => {
        console.log('click', event);
      });
    });
    this.myHtml = root.innerHTML;
  }

这是堆叠闪电战

您需要使用ngAfterViewInit()来实现此目的,我已经修改了代码并且可以正常工作。

请检查链接https://stackblitz.com/edit/angular-7da7cd

希望这可以帮助。

这可能是由于限制的原因,即在页面循环开始之前,将仅为元素注册事件侦听器。 您是否尝试过使用Renderer2做更多棱角分明的操作

this.renderer.listen('img', 'click', (evt) => {
  console.log('Clicking the document', evt);
});

文件: https : //angular.io/api/core/Renderer2

它尚未在DOM中。 ngAfterViewInit做同样的ngAfterViewInit

ngAfterViewInit() {
    const root = document.createElement('div');
    root.innerHTML = this.getHtml();
    const images = root.getElementsByTagName('img');
    Array.prototype.forEach.call(images, (image: HTMLImageElement, i) => {
      image.addEventListener('click', (event: any) => {
        console.log('click', event);
      });
    });
    this.myHtml = root.innerHTML;
  }

您可以使用elementRef来指定<img>元素。 然后,您可以使用以下命令将事件侦听器添加到所有<img>

ngAfterViewInit() {
    var elem = this.elementRef.nativeElement.querySelectorAll('img');
    if (elem) {
      elem.forEach(res => {
        res.addEventListener('click', this.onclick.bind(this));
      })
    }
}

注意:

onclick() {
    alert("Image clicked");
}

是可以自定义的自定义功能。 并且不要忘记import { ElementRef } from '@angular/core';

Stackblitz叉子

更多细节到AfterViewInit.bindElementRefRenderer之间的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM