【问题标题】:jQuery - how to attach handlers to elements which don't exist yet? [duplicate]jQuery - 如何将处理程序附加到尚不存在的元素? [复制]
【发布时间】:2014-09-16 08:00:00
【问题描述】:

我刚刚在 jQuery 中遇到了一个问题。我没有找到已经发布的解决方案,如果有,我为我的错误道歉。

我有这个 DOM:

<div class='usersList list'>                                    
    <div id='7' class='sidebarElement'> <span>user</span></div> 
    <div id='21' class='sidebarElement'><span>user</span></div> 
    <div id='12' class='sidebarElement'><span>user</span></div> 
    <div id='15' class='sidebarElement'><span>user</span></div> 
    <div id='17' class='sidebarElement'><span>user</span></div> 
    <div id='13' class='sidebarElement'><span>user</span></div> 
    <div id='5' class='sidebarElement'> <span>user</span></div> 
    <div id='3' class='sidebarElement'> <span>user</span></div> 
    <div id='4' class='sidebarElement'> <span>user</span></div> 
    <div id='19' class='sidebarElement'><span>user</span></div> 
    <div id='2' class='sidebarElement'> <span>user</span></div> 
    <div id='6' class='sidebarElement'> <span>user</span></div> 
    <div id='18' class='sidebarElement'><span>user</span></div> 
    <div id='16' class='sidebarElement'><span>user</span></div> 
    <div id='14' class='sidebarElement'><span>user</span></div> 
</div>                                                          

它是通过 AJAX 从另一个文件加载的。我遇到的问题如下。这是我的 JS:

$(document).ready(function () {

    function reloadUsers(query) {
        $.ajax({
            url: 'getLoginUsersAjax.php',
            type: 'GET',
            data: {query: query},
            success: function (data) {
                $('.usersCardAjaxContainer').empty().html(data);
            }
        });
    }

    $(".sidebarElement span").click(function() {
       console.log($(this).parent().attr("id"));
    })

    reloadUsers("");

});

这不起作用,我认为是因为元素是通过 AJAX 加载的,并且在解析 click 时还不在这里,我不知道 jQuery 在内部是如何工作的。我的解决方法是将点击甚至放到 ajax 的 success 分支中,如下所示:

success: function (data) {
    $('.usersCardAjaxContainer').empty().html(data);

    $(".sidebarElement span").click(function() {
        console.log($(this).parent().attr("id"));
    })
}

它有效,但对我来说似乎是错误的。我已经寻找可以做到这一点的其他函数或方法,但我只找到了自 jQuery 1.7 以来已弃用的 live。还有什么我可以使用的或者我必须坚持这个解决方法吗?

【问题讨论】:

  • 使用事件委托参见这里api.jquery.com/on
  • 您为什么没有在 Google(或其他任何地方)中搜索“动态元素上的 jquery 事件”之类的内容?
  • @Regent 我确实做到了,所有的解决方案都对我不起作用,但是嘿,与其抱怨我没有使用谷歌,你可以发布一个解决方案。 ;)

标签: jquery


【解决方案1】:

您可以将点击事件附加到一个已经存在的元素上,但让它只在该元素的某些子元素上触发,如下所示:

$('.sidebarElement').on('click', 'span', function() {
    //...
});

您甚至可以在技术上将您的事件附加到$('body'),只要第二个参数(它是一个 jquery 选择器)足够精确。我不会推荐这种方法,因为它肯定会对性能产生负面影响。 供参考,请查看jquery's .on() function

【讨论】:

  • 啊,现在我明白了,所以我将它附加到身体上,但只在.sidebarElement span 上触发它,对吧?所以我的活动是$('body').on('click', '.sidebarElement span', function() {,我理解对了吗?
  • Jup,适用于身体。非常感谢!
  • @Y U NO WORK:从不'body' 用于委派事件处理程序!使用document 作为后备(如果不存在更接近变化的元素)。 body 有一个与样式有关的错误,这意味着事件(尤其是点击)不会总是有效。
  • @TrueBlueAussie,这是哪个 jQuery 版本,这是一个公认的错误吗?我之所以问,是因为我最近有有趣的事件处理程序行为(blur() 被触发,并在对话中聚焦元素的空堆栈跟踪),具有“反转角色”,意思是:事件处理程序附加到一个元素然后附加到body
  • 我在最近的 jQuery 版本中发现了这个问题(不知道这是否是官方问题),所以现在我总是使用document 而不是bodydocument 有一个额外的好处,它在任何 DOM 加载之前就存在。
猜你喜欢
  • 2013-05-25
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多