You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 12.1用TypeScript动态添加HTML元素绑定(click)事件报错求助

错误原因

(click) 是Angular专属的模板绑定语法,仅在Angular编译的模板文件中会被识别处理。你通过原生DOM API创建元素时,调用setAttribute设置(click)属性既无法被Angular解析,浏览器也不识别这类带括号的自定义属性,因此会出现报错、事件无法触发的问题。

快速修复方案

直接替换事件绑定逻辑,使用原生addEventListener绑定点击事件即可,注意绑定组件上下文确保可以调用到popUp方法:

export class AppComponent {
    // 你的自定义popUp方法
    popUp(event: Event) {
      console.log('点击事件触发', event);
    }

    createEl(){
      console.time("timer");
      const container = document.getElementById('divEl');
      if (!container) return;
      for (let i = 0; i < 10; i++) {
        let div = document.createElement("div");
        div.textContent = `Hello, World! ${i}`;
        // 替换原有setAttribute逻辑
        div.addEventListener('click', (e) => this.popUp(e));
        container.appendChild(div);
      };
      console.timeEnd("timer");
    }
}

HTML代码无需修改。

Angular规范实现方案(推荐)

如果希望符合Angular的开发规范,避免直接操作原生DOM适配跨平台场景,可以使用Angular内置的Renderer2服务实现:

import { Component, Renderer2 } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  constructor(private renderer: Renderer2) {}

  popUp(event: Event) {
    console.log('点击事件触发', event);
  }

  createEl(){
    console.time("timer");
    const container = document.getElementById('divEl');
    if (!container) return;
    for (let i = 0; i < 10; i++) {
      const div = this.renderer.createElement('div');
      this.renderer.setProperty(div, 'textContent', `Hello, World! ${i}`);
      // 用renderer绑定点击事件
      this.renderer.listen(div, 'click', (e) => this.popUp(e));
      this.renderer.appendChild(container, div);
    }
    console.timeEnd("timer");
  }
}

内容的提问来源于stack exchange,提问作者Logwin Finserv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:48:01