jQuery动态添加元素后元素注册事件失效解决

当我们使用jQuery动态添加元素时,常常会遇到一些元素事件注册失效的问题。这是因为动态添加的元素在页面载入时并不存在于DOM中,所以我们需要找到一个有效的方法来注册事件。

下面是几种针对此类问题的解决办法。

方案一:事件委托

事件委托是指把事件绑定到父级元素上,让父级元素监听所有子元素的事件。由于父级元素存在于DOM中,所以动态添加的元素也可以被监听到。

例如,如果我们动态添加了一个按钮,我们可以将其父级元素赋予一个事件,以便监听按钮的事件。

// 给父元素绑定事件,监听子元素的点击事件
$("#parent").on("click", "button", function(){
    // ...
});

在上面的代码中,我们使用父级元素 #parent 来监听其内部动态添加的 button 元素的点击事件。这样,无论何时动态添加的按钮都可以被正常监听到。

方案二:重新注册事件

使用jQuery添加或删除元素时,常规的事件绑定使用 $(document).on('click', '#test', function(){}) 等方式是无效的。解决这个问题,可以使用 .delegate().live() 等方法。但是在jQuery 1.7版本之后推出了 .on() 方法,可以替换之前的方法。

我们可以将原来的事件监听使用一个函数进行封装,当添加元素时,重新调用该函数进行事件注册。

例如,在以下代码中,当我们添加一个分页元素时,会重新调用 bindPageEvents() 函数进行事件注册。

function bindPageEvents() {
    // 分页元素事件绑定
    $(".pagination a").on("click", function(){
        // ...
    });
}

// 添加分页元素
function addPagination() {
    var html = '<div class="pagination"><a href="#" class="page-link">1</a><a href="#" class="page-link">2</a><a href="#" class="page-link">3</a></div>';
    $("#container").append(html);

    // 注册事件
    bindPageEvents();
}

在上面的代码中,我们将分页元素的事件注册封装在一个函数 bindPageEvents() 中,并在添加分页元素时调用该函数重新进行事件注册。

示例一:使用事件委托

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>事件委托示例</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $(function(){
            $("#btn_add").click(function(){
                var html = '<button class="test">点击我</button>';
                $("#container").append(html);
            });

            $("#container").on("click", ".test", function(){
                alert("点击了动态添加的按钮");
            });
        });
    </script>
</head>
<body>
    <div id="container">
        <button class="test">点击我</button>
    </div>
    <button id="btn_add">动态添加按钮</button>
</body>
</html>

在上面的代码中,我们给 #container 元素绑定了一个委托事件监听它内部动态添加的 .test 元素的点击事件。当我们添加一个 .test 元素时,它会正常触发该事件。

示例二:重新注册事件

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>重新注册事件示例</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        function bindBtnEvents() {
            $(".test").on("click", function(){
                alert("点击了动态添加的按钮");
            });
        }

        $(function(){
            // 第一次注册按钮事件
            bindBtnEvents();

            // 动态添加按钮
            $("#btn_add").click(function(){
                var html = '<button class="test">点击我</button>';
                $("#container").append(html);

                // 重新注册按钮事件
                bindBtnEvents();
            });
        });
    </script>
</head>
<body>
    <div id="container">
        <button class="test">点击我</button>
    </div>
    <button id="btn_add">动态添加按钮</button>
</body>
</html>

在上面的代码中,当我们动态添加 .test 元素时,会调用 bindBtnEvents() 函数来注册事件。由于该函数只在第一次注册时被调用,所以我们每次添加元素时都需要重新调用该函数进行事件注册。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery动态添加元素后元素注册事件失效解决 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 什么是XMLHTTPRequest对象

    XMLHTTPRequest对象是JavaScript中的一个内置对象,它允许在不重新加载页面的情况下向服务器发送请求和接收响应。以下是XMLHTTPRequest对象的完整攻略: 步骤一:创建XMLHTTPRequest对象 要使用HTTPRequest对象,首先需要创建一个实例。以下是一个示例: // Create a new XMLHTTPReques…

    jquery 2023年5月9日
    00
  • jQuery UI Datepicker destroy()方法

    jQuery UI 的 Datepicker 组件提供了一个 destroy() 方法,该方法用于销毁一个已经初始化的 Datepicker 实例。在本教程中,我们将详细介绍 Datepicker destroy() 方法的使用方法。 destroy() 方法基本语法如下: $( ".selector" ).datepicker( &qu…

    jquery 2023年5月11日
    00
  • jQuery Ajax方式上传文件的方法

    当我们想要在网站中上传文件时,可以使用jQuery框架提供的Ajax方式上传文件。下面是具体的操作步骤: 步骤一:准备HTML代码 首先,我们需要在HTML中添加一个文件上传表单,代码如下: <form enctype="multipart/form-data" id="myForm"> <input…

    jquery 2023年5月27日
    00
  • 纯js三维数组实现三级联动效果

    首先,要实现三级联动效果,我们需要先了解什么是三维数组。三维数组就是一个数组中包含着多个二维数组,而每个二维数组中又包含着多个一维数组,这样一层层嵌套下去,就形成了三维数组。在实现三级联动效果时,我们可以使用三维数组来实现。 下面是一个简单的示例代码,实现了一个三维数组,并打印出其中的一个元素: var arr = [[[1, 2], [3, 4]], [[…

    jquery 2023年5月28日
    00
  • 如何使用jQuery Mobile制作非内嵌式折叠器

    以下是使用jQuery Mobile制作非内嵌式折叠器的完整攻略: 首先,需要在HTML文件中引入jQuery Mobile库。可以通过以下代码实现: <head> <meta charset="utf-8"> <meta name="viewport" content="wid…

    jquery 2023年5月11日
    00
  • jQuery实现的简单折叠菜单(折叠面板)效果代码

    现在就详细讲解一下“jQuery实现的简单折叠菜单(折叠面板)效果代码”的完整攻略。 标题 首先,我们需要了解一下什么是折叠菜单或者折叠面板。折叠菜单一般用于展示一些可选择的内容,用户可以根据自己的需求选择不同的选项。折叠面板则是在有限的空间内实现不同内容的时候一种常用的方式。 HTML结构 在实现折叠菜单或折叠面板之前,我们需要先思考一下HTML结构。通常…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGrid pagechanged事件

    jQWidgets jqxGrid pagechanged事件详解 jQWidgets jqxGrid 是一种表格控件,用于在 Web 应用程序中创建表格。pagechanged 事件是 jqxGrid 控件的一个事件,用于在分页更改时触发。本文将详讲解 pagechanged 事件的使用方法,并提供两个示例。 事件 pagechanged 事件用于在分页更…

    jquery 2023年5月10日
    00
  • jQuery选择器源码解读(三):tokenize方法

    让我来详细讲解一下“jQuery选择器源码解读(三):tokenize方法”的完整攻略。 什么是tokenize方法? 在jQuery中,选择器是通过parseTree方法来解析的。而在parseTree方法中,会先调用tokenize方法来将选择器字符串转化为一组tokens,然后再将这些tokens组合成语法树。因此,tokenize方法是解析选择器字符…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部