2012-02-07 27 views
3

我使用AJAX更新容器。在性能方面哪个更好?伪代码:哪个更好,刷新后还是live()(jQuery)?

$.post('get_something.php',function(data){ 
    $('#container').html(data).find('a').bind('click',function(){ 
     console.log('Doh!'); 
    }); 
}); 

或者这个?

$('#container a').live('click',function(){ 
    console.log('Doh!'); 
}); 

$.post('get_something.php',function(data){ 
    $('#container').html(data); 
}); 
+0

第一个脚本 – mgraph 2012-02-07 12:43:06

+2

组合使用的第二与'上()'。建议并在性能最好使用'上()'代替'绑定()'和' live()'from jQuery 1.7 - http://api.jquery.com/on/ – MarkSmits 2012-02-07 12:43:43

+0

如果有一个控制的数量,比如说1-5,不更新的元素,那么'bind()'优先?这个事件会在没有在DOM周围徘徊的情况下被触发? – 2012-02-07 13:00:45

回答

6

首先,我不建议使用live所有(与jQuery开发团队已经过时的话)。我会使用delegate(或新版本的on)与一个更具针对性的容器(在您的情况下,#container)比整个文档。

如果你这样做,在点击时性能会如此接近相同,以使没有什么区别(我们这里处理用户生成的事件,奇额外的几毫秒不做没关系) 。

虽然还有其他考虑(嗯)考虑。假设我们有这样的标记:

<div id="container"> 
    <div id="wrapper"> 
     <a>A link</a> 
    </div> 
</div> 

...这代码:

$("#container").delegate('a', 'click', function() { 
    // Do something with the click 
    console.log("Link was clicked"); 
}); 
$("#wrapper").click(function() { 
    return false; 
}); 

由于a是最深的元素,你会期望在a点击由第一处理处理程序并查看console.log条目。但是你不会,因为点击实际上没有被处理,直到到达容器  —并且在这种情况下,它不会到达容器,因为它们之间的包装元素停止事件。

这不是负面的(我发现delegate非常有用并且一直都在使用它),这只是在您设计您如何处理事情时需要考虑的事情。

+0

什么时候只有一个元素?即使是那样,bind()很糟糕? – 2012-02-14 09:47:18

+0

@MarttiLaine:我不认为我说bind是坏的。 - )我的观点是,任何一种方法都非常好,而你在点击响应时间内不太可能看到任何实际差异。所以要么在回调中使用'bind',要么使用'delegate'(或者'on'的委托特性),无论你喜欢什么,即使只有一个元素。 – 2012-02-14 10:01:13

2

这两个,第一个选项。然而,除了他们两个更好的是delegate()

$("#container").delegate(".filter", "click", function() { 
    // do something on click of .filter element. 
}); 
1

FYI它指出

“毕竟,绑定显得那么更清晰,更直接,没有它那么,有2个原因,我们倾向于委托或活绑定:

  • 由于绑定直接绑定处理程序到单个元素,因此它不能将它们绑定到尚未在页面上的元素,如果你是 运行$( 'a')。bind(...),然后将新的链接添加到通过AJAX页面 ,您的绑定处理程序将不适用于这些。另一方面,代理另一方面绑定到另一个祖先节点,所以它 将工作任何元素现在或将来在那个 祖先元素内存在。

  • 或一个处理程序附加到一个单一的元素或小群 元件,监听的后代元素的事件,而不是 循环通过并且将相同的功能,以在DOM 100个单独 元件。这将是 将处理程序附加到一个(或一小组)祖先元素 的性能优势,而不是直接将处理程序附加到页面上的所有元素。 “

answer source

相关问题