为什么动态添加onclick函数不起作用?

why doesn't onclick function work when I add it dynamically?

提问人:heumn 提问时间:11/9/2023 最后编辑:heumn 更新时间:11/9/2023 访问量:70

问:

我正在向页面添加一个html标签

<div id="asd" >
        <button id="gaga" onclick="onClick()"></button>
        <script type="text/javascript">
                        function onClick() {
                            console.log(":(");
                            const element = document.getElementById('asd');
                            if (element) {
                                element.remove();
                           }
                       }
                    </script>
    </div>

在我加载页面并通过 servlet 动态添加此标记后,我尝试单击该按钮,但控制台中出现错误:

enter image description here

我正在考虑通过 servlet 将此标签和脚本添加到其中,但由于某种原因,浏览器在页面上看不到此功能

编辑: 我通过 websocket 将代码上传到页面(在第一页上我等待按钮出现,在第二页上我在第一页上使用 get 请求创建它)

Servlet 代码:

在此处输入图像描述

JavaScript HTML Servlet

评论

0赞 Barmar 11/9/2023
将脚本分配给 时不会执行脚本。.innerHTML
0赞 Quentin 11/9/2023
@Barmar——和它有什么关系?他们说它是由servlet(即服务器端Java代码)添加的,尽管他们没有包含它。他们包含的 JS 根本没有使用。innerHTMLinnerHTML
0赞 Barmar 11/9/2023
@Quentin 我假设服务器正在使用 动态添加它,因为它与症状相匹配。innerHTML
0赞 Barmar 11/9/2023
@Quentin 它们显示的 HTML/JS 是 servlet 添加的内容。他们没有发布 servlet 本身。
0赞 Quentin 11/9/2023
@Barmar — 他们展示作品的 HTML/JS。如果它是由 servlet 添加的,那么它不会使用,因为那不是 servlet API。也许他们正在对 servlet 进行 Ajax 调用,然后使用 innerHTML 添加结果,但他们没有这么说。这个问题确实需要一个最小的可重复的例子innerHTML

答:

-2赞 A_mohii_ 11/9/2023 #1

因为浏览器不知道新添加的元素。动态添加 HTML 标记时,浏览器需要重新分析 DOM(文档对象模型)以识别新元素。此过程需要一些时间,在重新解析 DOM 之前,浏览器将无法识别新添加按钮上的 onclick 属性。

若要解决此问题,可以使用事件委派将 onclick 事件处理程序附加到 DOM 中已存在的父元素。这样,浏览器就不需要在每次添加新按钮时重新解析 DOM,并且 onclick 事件处理程序仍将有效。

<div id="asd">
  <button id="gaga"></button>
  <script type="text/javascript">
    document.getElementById('asd').addEventListener('click', function(event) {
      if (event.target.id === 'gaga') {
        console.log(":(");
        const element = document.getElementById('asd');
        if (element) {
          element.remove();
        }
      }
    });
  </script>
</div>

使用此代码,onclick 事件处理程序将附加到父 div 元素,并且浏览器不需要在每次添加新按钮时重新解析 DOM。事件处理程序仍将起作用,您将能够删除新添加的按钮而不会出现任何错误。

评论

0赞 Quentin 11/9/2023
“当你动态添加 HTML 标签时,浏览器需要重新解析 DOM(文档对象模型)”——他们说他们使用的是 servlet(即做这个服务器端),而不是客户端 JS/DOM。
0赞 Barmar 11/9/2023
没有,他们在 HTML 中使用内联。addEventListener()onclick=