【问题标题】:Dynamically added elements don't trigger the animation动态添加的元素不会触发动画
【发布时间】:2014-08-04 15:42:13
【问题描述】:

在我的插件中,一些元素会关闭侧边栏。例如,如果在侧边栏中有一个列表:

<ul>
    <li>element 1</li>
    <li>element 2</li>
    <li>element 3</li>
</ul>

li 元素会触发关闭动画。 我的问题是,如果某些元素是异步加载的,插件将不会“看到”这些元素并且不会触发动画。 不仅仅是AJAX,我说的是所有动态加载的元素

代码很简单,这里有一个例子:

var $elements = 'li';

$elements.click(function() {
    $sidebar.animate({
        //animation
    });
});

如何使这些元素对插件可见?

这里有完整的代码https://github.com/dcdeiv/simple-sidebar/blob/master/jquery.simplesidebar.js

【问题讨论】:

  • 大多数插件要么 1) 使用委托事件,所以可以正常工作,或者 2) 他们有一个 refresh 你调用的选项(这个插件似乎没有),或者 3) 你必须重新运行它们(有时在清理它们可以进行的初始重新格式化之后)或 4)它永远不会工作并且需要重写。

标签: javascript jquery asynchronous jquery-plugins


【解决方案1】:

动态元素不会触发回调,因为没有事件监听器绑定到这些动态元素。
如果您想处理尚不存在的元素的事件,或者使用将选择动态添加的元素的选择器,您应该委托该事件:

$(document).on('click', 'li', function()
{
    //handle
});

此代码在文档本身上绑定了一个点击侦听器,如果li 元素是绑定了侦听器的元素的子元素,则每次注册的点击都会调用回调。例如:

<div id='foo'>
    <div id='bar'>
        <span> test</span>
    </div>
    <span> test2</span>
</div>

考虑这段代码:

var outer = $('#foo');
$('#bar').on('click', 'span', function()
{
    outer.append($('<span>Added</span>'));
});

这将在每次点击 bar 元素内的 span 时将 span 添加到 foo div。当您单击不是&lt;div id='bar'&gt; 的子代的跨度时,它不会被调用
然而,这段代码:

$('#foo').on('click', 'span', function()
{
    console.log(this);
});

将对&lt;div id='foo'&gt; 元素内的 all 范围内的点击做出反应。动态和静态都一样,甚至是bar div 内的跨度。

基本经验法则:像这样阅读这些 sn-ps:

$(document).on('click',   'div',    function(){});
  <scope>     <event>  <selector>   <callback>
on event in <scope> for elements matching <selector>, apply <callback>

【讨论】:

  • 这对非动态添加的元素也有效吗?
  • @dcdeiv:是的。它在事件(单击)冒泡到更高的 DOM 元素(在本例中为 document)后应用 jQuery 过滤器。
  • @dcdeiv:是的,添加了更多细节以完成答案
【解决方案2】:

您可以在页面上呈现后绑定元素。
使用 jquery 绑定功能。

【讨论】:

  • 为什么?委托只需要一名听众。句号,故事结束......不用担心.bind的混乱
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2018-11-09
  • 2014-04-01
相关资源
最近更新 更多