代码之家  ›  专栏  ›  技术社区  ›  nemesisdesign

jQuery性能:$('\selector').live()与手动绑定(在处理ajax请求时)

  •  11
  • nemesisdesign  · 技术社区  · 15 年前

    在处理异步加载的内容时,从性能角度看,以下各项之间是否存在任何差异:

    // .live()
    $('#mybutton').live('click', function(e){ doSomething(); });
    

    并手动绑定()每次加载内容后我们需要的事件:

    // manual bind every time
    $.ajax({
        url: url,
        success: function(data){
            mycontainer.html(data); // data contains #mybutton
            $('#mybutton').click(function(e){ doSomething(); });  
        }
    });
    

    ?

    3 回复  |  直到 15 年前
        1
  •  13
  •   Nick Craver    15 年前

    有不同的成本,让我们看看它们:

    $('#mybutton').live('click', function(e){ doSomething(); });
    

    这里有两个主要成本:

    • 这个 #mybutton 选择器需要毫无理由地立即运行(结果被丢弃,我们只是想要选择器……我们绑定到 document ). 在这种情况下 #id selector 所以,这是一个非常低的成本…在其他情况下,它不便宜,而且非常浪费(例如 [attr=something] ).
    • 每 click 泡沫达到 文件 现在必须对照这个选择器进行检查,每次单击的评估成本,这会随着您期望的单击次数而变化。

    现在让我们看看另一种方法:

    $('#mybutton').click(function(e){ doSomething(); });  
    

    这里还有两个主要成本:

    • 这个 #我的按钮 选择器运行,但每个ajax请求只运行一次。不过,我们不是在浪费时间,而是在利用结果。
    • 这个 点击 处理程序绑定到实际元素,而不是 文件 ,所以有一个绑定成本 每个 时间在流逝,而不是一次

    但是,没有每次点击的成本,选择器调用本身也没有浪费…所以总体来说更好, 因为你用的是身份证 ,这在其他情况下是不正确的。


    在您的例子中,因为您处理的是一个ID(并保证只有一个元素), 这便宜多了 :

    $('#mybutton').click(function(e){ doSomething(); }); 
    

    在其他情况下,当你绑定数百个元素时, .live() 是明显的赢家 .delegate() 会更好。

        2
  •  1
  •   Nathan MacInnes    15 年前

    可能有点,但我不担心。对我来说 .live() 方法看起来更容易维护,所以我会使用它。只要没有什么会令人痛苦地慢下来,就不必担心JavaScript的性能。

        3
  •  1
  •   Simon    15 年前

    从success函数的外观来看,您附加了一个事件,因为该元素现在在html中可用?是这样吗?

    如果是这样,那么如果通过click调用的函数总是相同的,那么您可以使用“live”。Lead允许绑定到尚未存在的事件。所以你可以把这个放在文件之前。准备好了。然后,当ajax更新主文档时,该事件应该始终有效。你不需要每次都分配。

    因此,不必每次从ajax调用返回时都执行某些操作,这样可以获得性能上的好处,您可以在不依赖document.ready的情况下执行设置,并且保证它可以正常工作。

    哦。