使用jQuery .on()方法不会在动态创建的元素上绑定事件

时间:2019-06-22 20:08:03

标签: jquery html events anchor

我目前在一个具有注销按钮的网站上工作,只要窗口达到一定大小,该按钮就会动态地插入到侧边栏中。当我单击注销按钮时,我想调用方法logOut();

我查看了其他帖子,但解决方案似乎对我不起作用。如果我在主页上单击该元素,则会调用该方法,但是当我调整窗口大小并且该元素被“重新添加”到网页时,它不会执行任何操作(ID选择器是正确的,因为样式就在那里)。

$(document).ready(function()
{
    $(document).on("click", "#btnLogOut", function()
    {
        logOut();
    });
});

我希望单击锚标记后会调用logOut()方法,但是即使.on()方法可以处理动态创建的元素,它也不会执行任何操作

编辑:这是在调整大小后如何将元素重新添加到页面中。包含注销锚点标记的nav元素通过navList();方法制成列表,然后附加到正文中。我确保指定注销按钮需要保留其ID。只添加与注销按钮相关的代码。

$.fn.navList = function() {

    var $this = $(this);
        $a = $this.find('a'),
        b = [];

    $a.each(function() {

        var $this = $(this),
            indent = Math.max(0, $this.parents('li').length - 1),
            href = $this.attr('href'),
            target = $this.attr('target');
        if($a.attr("id") === "btnLogOut") {
            console.log($a);
            b.push(
                '<a ' +
                    'id="btnLogOut" ' + 
                    'class="link depth-' + indent + '"' +
                    ( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
                    ( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
                '>' +
                    $this.text() +
                '</a>'
            );
        }

    });

    return b.join('');

};
            $(
                '<div id="navPanel">' +
                    '<nav>' +
                        $('#btns').navList() +
                    '</nav>' +
                '</div>'
            )
                .appendTo($body)

1 个答案:

答案 0 :(得分:0)

不要让您的内心烦恼, jQuery .on() 绝对与动态注入的元素一起使用。那么,是什么导致它在这种情况下不起作用?

首先,最常见的原因是:拼写和/或大写。您没有大写其中一个字符吗?例如#btnLogOut#btnLogout

不同

第二个同样常见的错误:页面上的ID重复。更改所需按钮的ID,然后再次测试(在ID的末尾添加三个字符的后缀_zq-一个不太可能的字符串后缀-并记住同时更改HTML ID和ID jQuery引用)

有时候,您只需要更加具体即可。尝试添加一些父ID和类,而不要使用#btnLogOut。例如,如果这是您的结构:

<div class="row bob">
    <div class="container sam ed tom">
        <div class="dialog frank lg pc6">
            <div class="dlg-bottom">
                <button id="btnLogOut">Log Out</button>

然后创建您的jQuery语句:

$(document).on('click', '.row .container .dialog .dig-bottom #btnLogOut', function(){
    //code goes here
});

如何测试您拥有的物品

在按钮已添加到页面并在屏幕上可见的位置:

  1. 右键单击按钮,从弹出菜单中选择Inspect Element

  2. Chrome的DevTools将打开

  3. 如果控制台在DevTools窗口的下半部分不可见,请按 Esc

  4. 在控制台输入区域中,输入:$('#btnLogOut').length

您应该看到数字1出现在该行下面。

如果收到消息Uncaught TypeError: $ is not a function,则应首先inject jQuery into DevTools,然后再次尝试步骤4。