jQuery 不为动态创建的元素工作

在使用 jQuery 进行 DOM 操作时,我们可能会遇到一个问题:当我们动态创建元素并将其添加到文档中后,jQuery 选择器不能正确地找到这些新元素。本文将介绍这个问题的原因,以及如何解决这个问题。

问题的原因

当文档加载完成后,jQuery 将使用选择器查找文档中所有匹配的元素,并保存它们的引用。然而,如果我们在文档加载后通过 JavaScript 动态创建了新的元素并将它们添加到文档中,jQuery 并不会自动更新它的引用列表。因此,我们不能使用 jQuery 的选择器来选择这些动态创建的元素。

考虑下面的示例:

--------- -----
------
------
    ------------- ------------
    ------- -----------------------------------------------------------
-------
------
    ---- ---------------------
    ------- ------------------- ----------------
    --------
        ---------------------------- -
            --------------------------------- -
                ------------------------------ --------------
            ---
            ----------------------- -
                ------------------
            ---
        ---
    ---------
-------
-------

在这个示例中,我们有一个空的 div 容器和一个添加元素的按钮。当我们点击按钮时,会向容器中添加一个新的 p 元素。我们还添加了一个点击事件监听器,在用户单击任何 p 元素时都会弹出警告框。

然而,当我们运行这个示例并单击添加元素按钮后,我们会发现点击新创建的 p 元素不会触发警告框。这是因为 jQuery 在文档加载完成时已经缓存了 p 元素的引用列表,它并不知道我们添加了一个新的 p 元素。

解决方案

为了解决这个问题,我们需要使用一种不同的方式来选择动态创建的元素。jQuery 提供了几种方法来选择动态创建的元素,以下是其中两种方法:

方法一:使用 .on() 方法

使用 .on() 方法可以绑定事件处理程序到父元素上,该父元素包含动态创建的元素。例如,我们可以更改之前的示例代码,如下所示:

--------- -----
------
------
    ------------- ------------
    ------- -----------------------------------------------------------
-------
------
    ---- ---------------------
    ------- ------------------- ----------------
    --------
        ---------------------------- -
            --------------------------------- -
                ------------------------------ --------------
            ---
            --------------------------- ---- ---------- -
                ------------------
            ---
        ---
    ---------
-------
-------

在这个示例中,我们使用了 .on() 方法来绑定 click 事件处理程序到包含动态创建的 p 元素的容器 div#container 上。当用户单击任何 p 元素时,事件会冒泡到容器上,触发事件处理程序。由于我们使用了选择器 "p",因此只有被点击的 p 元素才会触发事件处理程序。

方法二:使用 .delegate() 方法

另一种选择动态创建的元素的方法是使用 .delegate() 方法。.delegate() 方法与 .on() 方法类似,但它是在 jQuery 1.7 之前引入的,因此它可能不再受支持。以下是一个使用 .delegate() 方法的示例代码:

--------- -----
------
------
    ------------- ------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------