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日

相关文章

  • firefox浏览器firebug插件调试js(jqueryt)程序(firefox调试js)

    Firefox浏览器Firebug插件调试JS(JQuery)程序 什么是Firebug插件? Firebug插件是一款浏览器调试工具,它能帮助开发者追踪并调试网站中发生的各种问题。Firebug的一些主要功能包括: HTML和CSS编辑器,可以实时地对代码进行修改并查看更改后的效果; JavaScript调试器,可以对代码进行单步调试、查看变量和监控函数执…

    jquery 2023年5月28日
    00
  • 大白话讲解JavaScript的Promise

    大白话讲解JavaScript的Promise 在编写 JavaScript 程序时,经常需要处理异步操作,异步操作并不会在当前代码执行完成后立即返回结果。这时候 Promise 成为了我们处理异步操作的不二选择。 什么是Promise Promise 是一种异步编程的解决方案,通过 Promise 可以更加优雅地组织和处理异步操作。它通过简单的方式来管理复…

    jquery 2023年5月27日
    00
  • jQWidgets jqxChart titlePadding 属性

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxChart,它是用于绘制图表的组件。jqxChart 提供多个属性,其中之一是 titlePadding。下面是关于 jqxChart 的 titlePadding 属性的详细攻略: titlePadding 属性概述 titlePaddi…

    jquery 2023年5月11日
    00
  • jQWidgets jqxSplitter disable() 方法

    jQWidgets 是一款基于 jQuery 的前端组件库,而 jqxSplitter 就是它提供的一种可以分离、调整大小的面板组件。jqxSplitter 提供了许多方法供我们使用,其中 disable() 方法用于禁用 jqxSplitter,本文将详细讲解这个方法的使用方法和相关注意事项。 disable() 方法的基本用法 jqxSplitter 提…

    jquery 2023年5月11日
    00
  • jQuery UI滑块value选项

    以下是关于 jQuery UI 滑块 value 选项的详细攻略: jQuery UI 滑块 value 选项 value 选项用于设置滑块的初始值。当滑块被初始化时,可以通过设置 value 选项指定滑块的初始值。 语法 $( ".selector" ).slider({ value: value }); 其中,value 为要设置的初…

    jquery 2023年5月11日
    00
  • jQuery UI Datepicker closeText选项

    以下是关于 jQuery UI Datepicker closeText 选项的详细攻略: jQuery UI Datepicker closeText 选项 closeText 选项允许您自定义日期选择器中的关闭按钮文本。您可以指定关闭按钮的文本以便用户更好地理解该按钮的功能。 语法 $(selectordatepicker({ closeText: &q…

    jquery 2023年5月11日
    00
  • 如何使用jQuery创建隐藏的表单元素

    使用jQuery创建隐藏的表单元素可以通过以下步骤实现: 步骤一:在HTML中创建表单元素 首先,我们需要在HTML中创建表单元素。表单元素可以是文本框、复选框、单选按钮等等,这些元素可以通过表单提交给服务器端进行处理。我们可以使用如下代码创建一个文本框: <input type="text" name="username…

    jquery 2023年5月12日
    00
  • jQWidgets jqxTreeGrid autoShowLoadElement属性

    jQWidgets jqxTreeGrid autoShowLoadElement 属性 jqxTreeGrid 是 jQWidgets 提供的一个树形表格组件,它可以展示层级结构的支持多种交互。jqxTreeGrid 提供了 autoShowLoadElement,用于自动显示加载素。 autoShowLoadElement 属性 autoShowLoad…

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