Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery-为什么是;“生活”;效率低下?我们如何衡量这一点?_Jquery_Live - Fatal编程技术网

jQuery-为什么是;“生活”;效率低下?我们如何衡量这一点?

jQuery-为什么是;“生活”;效率低下?我们如何衡量这一点?,jquery,live,Jquery,Live,为什么程序员说“活”是低效的 那么,还有什么选择呢 复制该函数的方法 那会更有效吗 我们如何衡量它使事情减速的程度的影响 我认为这是低效的,因为处理程序放在根节点上,并且依赖冒泡来捕获事件并运行适当的处理程序 一种替代方法是在动态创建的元素被创建并添加到DOM中时,简单地将处理程序绑定到动态创建的元素 另一种选择是将单个处理程序绑定到一个容器,并让您的事件达到这个目的。如果您将许多相同的元素添加到容器中,这会很好 <div id="myContainer"> <div

为什么程序员说“活”是低效的

  • 那么,还有什么选择呢 复制该函数的方法 那会更有效吗
  • 我们如何衡量它使事情减速的程度的影响

  • 我认为这是低效的,因为处理程序放在根节点上,并且依赖冒泡来捕获事件并运行适当的处理程序

    一种替代方法是在动态创建的元素被创建并添加到DOM中时,简单地将处理程序绑定到动态创建的元素

    另一种选择是将单个处理程序绑定到一个容器,并让您的事件达到这个目的。如果您将许多相同的元素添加到容器中,这会很好

    <div id="myContainer">
        <div class="myElement>element</div>
        <div class="myElement>element</div>
        <div class="myElement>element</div>
        <div class="myElement>element</div>
    </div>
    
    我认为这可能与
    .live()
    一样存在一些效率低下的问题,但应该更好,因为它更本地化。新增
    .myElement
    项,自动生效


    编辑:

    根据:从jQuery1.4开始,事件冒泡可以选择在DOM元素“context”处停止

    这似乎会产生与我提到的上一种方法类似的效果


    编辑:

    正如Nick Craver所建议的,jQuery的
    .delegate()
    方法可以更干净地产生类似的效果

    尼克提供的示例:

    live()
    只有在以下情况下才会被视为低效:

  • 有少量元素要绑定到一个事件(<5)
  • 这些目标元素的数量保持不变
  • 如果您的用例满足上述标准(特别是#2),那么您应该坚持直接绑定到元素,并避免
    live()

    您可以尝试对
    live()
    的性能进行基准测试的一个示例是,分析一段代码,该代码使用
    live()
    单击
    处理程序绑定到一个元素,并分析另一段代码,该代码使用
    单击()
    绑定到同一元素


    我不太确定你会得到什么样的最终结果,但我相信这会很有趣。

    正如@patrick所建议的,它可能效率低下,因为它需要处理文档上的所有事件,无论气泡是否到达元素

    这是可以帮助的地方,因为它的工作方式与live相同,但通过将文档限制在一个公共父级,它只能影响文档的一小部分

    (以他的例子)


    哪些程序员?关于什么“活”的事情?什么样的复制方法?我要在这里提到
    .delegate()
    ,一种更简洁的方法来完成第二个示例:)@Nick Craver-不是
    .delegate()
    将处理程序绑定到每个元素吗?我提到的方法的一个优点是,在多个元素上没有处理程序的开销。+1如果您给出一个示例:)您当前的标记将使用以下内容:
    $('#myContainer').delegate('.myElement','click'function(){alert($(this.text());})
    @patrick-它使用上下文绑定处理程序,就像
    .live()
    (实际上
    .delegate()
    在内部调用
    .live()
    )一样,而不是在
    文档
    上侦听气泡,它侦听绑定到的元素,因此这是相同的行为,只是更早地抓住气泡而已。@Nick Craver-非常感谢。也只是看了一下文档,我误解了
    .delegate()
    。谢谢你的提示。我包括了你的解决方案。
    $('#myContainer').click(function(e) {
        $target = $(e.target);
        if($target.closest('.myElement').length) {
            // Run my code for the click
        }
    });
    
    $('#myContainer').delegate('.myElement', 'click' function() { alert($(this).text()); });
    
    $('#myContainer').delegate('div.myElement', 'click', function(){});