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() 方法的示例代码:

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

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

猜你喜欢

  • Virtual DOM是干什么的?

    在前端开发中,我们经常听到Virtual DOM(虚拟DOM)这个概念。它被认为是现代Web应用程序的核心技术之一。那么,Virtual DOM究竟是什么?它有什么用处呢? 什么是Virtual DO...

    7 年前
  • 如何传递数组到jQuery data()属性

    在前端开发中,我们经常需要在DOM元素上存储一些数据。jQuery提供了一个方便的方法来实现这个目标,那就是使用data()方法。但是,当我们需要存储一个数组时,该如何操作呢?本文将详细介绍如何将数组...

    7 年前
  • 如何在JavaScript中传递参数到匿名函数?

    在JavaScript中,我们可以使用匿名函数来执行一些特定的任务,并将其作为参数传递给其他函数。但是,在某些情况下,我们需要将参数传递给这些匿名函数,以便它们能够完成所需的操作。

    7 年前
  • 在淘汰赛视图-嵌套上下文中访问父$双亲

    在前端开发中,我们经常会遇到需要在子组件中访问父组件的数据或方法的情况。Vue.js 提供了一种方便的方法来实现这一目标,即使用 $parent 属性。 $parent 属性 $parent 是 Vu...

    7 年前
  • JavaScript中使用+符号连接字符串的技巧

    在JavaScript中,我们可以使用+符号来连接两个字符串,将它们合并成一个新的字符串。但是,这个操作还有更多的用途,例如连接不同类型的数据和模板字面量。下面将详细介绍+符号连接字符串的技巧,并提供...

    7 年前
  • 从其他系统调用SignalR枢纽的客户端

    在前端开发中,SignalR是一种非常有用的技术。它允许实时通信和双向数据传输,可以使应用程序更加动态和交互性。但是,当你试图将SignalR与其他系统集成时,可能会遇到一些困难。

    7 年前
  • 我可以在整个页面加载之前运行JavaScript吗?

    在前端开发中,我们通常需要在页面加载完成后执行JavaScript代码。但是有时候我们希望能够在整个页面加载之前执行JavaScript代码,例如在网站性能优化中进行预加载资源或者提前获取数据等操作。

    7 年前
  • JavaScript中的强制类型到底是什么?

    在JavaScript中,变量的类型可以根据值自动推断,这种行为称为弱类型。然而,有时我们需要将变量强制转换为其他类型。本文将深入探讨JavaScript中的强制类型转换,以及如何使用它们。

    7 年前
  • 插入文件得到Mongo NodeJS _id数据库

    在Web应用程序开发中,使用MongoDB进行数据存储是一种流行的选择。MongoDB是一个NoSQL文档数据库,它具有动态模式、灵活性和可扩展性。Node.js是一个非常流行的JavaScript运...

    7 年前
  • 正则表达式中的 / _ / g 是什么意思?

    正则表达式是一种用于匹配模式的文本字符串。在 JavaScript 中,正则表达式可以使用 /pattern/flags 的形式来创建。其中 flags 可以包含多个选项,如 i(忽略大小写)、g(全...

    7 年前
  • 如何在JavaScript中获取DOM元素的html

    在前端开发中,我们通常需要操作页面上的 DOM 元素。有时候,需要获取某个元素的 HTML 内容,以便进一步处理或展示。本文将详细介绍如何在 JavaScript 中获取 DOM 元素的 HTML 内...

    7 年前
  • 承诺/延迟库是如何实现的?

    JavaScript 中,异步操作是非常常见的一种情况,例如网络请求、I/O 操作等都需要等待一定时间才能获得结果。在处理这些异步操作时,我们通常使用 Promise(承诺)来管理异步状态,而 Pro...

    7 年前
  • 让事件侦听器连接到节点:使用 addEventListener

    在前端开发中,事件是非常重要的概念。例如,当用户点击按钮时,需要执行相应的代码。在 JavaScript 中,我们可以通过添加事件监听器来实现这个功能。 在本文中,我们将深入探讨如何使用 addEve...

    7 年前
  • JavaScript中的三元运算符

    在JavaScript中,三元运算符(ternary operator)是一种非常有用的表达式。它可以让代码更加简洁和易读,同时也能够提高代码的可维护性和可重用性。

    7 年前
  • 设置函数参数的类型

    在前端开发中,我们经常需要定义函数并传入参数。为了保证函数能够正确地处理数据,我们需要对传入的参数进行类型检查和验证。本文将介绍如何在 JavaScript 中设置函数参数的类型。

    7 年前
  • 用 JavaScript 打开新窗口中的 URL

    在 Web 开发中,我们经常需要在用户点击链接时打开一个新窗口来显示相关内容。本文将介绍如何使用 JavaScript 在新窗口中打开指定的 URL。 使用 window.open() 方法 Java...

    7 年前
  • "所有但不是" jQuery 选择器

    jQuery 是一个广泛使用的 JavaScript 库,它可以帮助前端开发人员更快地编写交互式和动态的 Web 应用程序。在 jQuery 中,选择器是一种强大而灵活的工具,可以使您更轻松地选择和操...

    7 年前
  • 用 JavaScript 或 jQuery 检测 Mac OS X 或 Windows 计算机的最佳方法

    在前端开发中,我们可能需要根据用户操作系统的不同来提供定制化的体验,例如展示不同的下载链接或者使用不同的字体等。本文将介绍如何使用 JavaScript 或 jQuery 来检测用户的操作系统,并通过...

    7 年前
  • 从字符串中删除最后一个逗号

    在前端开发中,有时候需要对字符串进行处理,比如在一些场景下需要将字符串中的最后一个逗号去掉。本文将介绍几种不同的方法来实现这个目标。 方法一:使用 JavaScript 的字符串函数 JavaScri...

    7 年前
  • 在JavaScript中给URL添加一个onclick函数

    在前端开发中,我们通常需要在用户点击链接时执行一些特定的操作。通常情况下,我们可以使用<a>标签和href属性来创建链接,并使用JavaScript添加一个onclick函数来处理点击事件...

    7 年前

相关推荐

    暂无文章