jquery .bind() vs .live() vs .delegate() vs .on()

假设我们有这样一段html:

  • book 1
  • book 2

1: .bind()
.bind方法的用法是这样的:targetElment.bind('eventType', eventHandler)
所以假入我们要给

  • 元素绑定一个click事件,那就这样写:

    $(document).ready(function(){
        $('.bookList li').bind('click', function(event){
            $(this).addClass('red');
        })
        
        $('button').bind('click', function(event){
            $('.bookList').append('
  • book 3
  • '); }) })

    jquery .bind() vs .live() vs .delegate() vs .on()_第1张图片

    最开始只有两个

  • 元素,点击
  • 的时候会往当前被点击的
  • 上面添加一个名为‘red’的class。通过点击‘add a li’这个button, 添加一个新的
  • 元素。但是当我们点击新添加的
  • 元素(也就是'book 3')时,却没有把'red'这个class加给它。所以可以看到bind()有的缺点是:

    1: 对于动态添加的元素不会绑定事件
    2: 它会给每一个满足条件的dom元素都绑定这个eventHandler
    3: 它会带来性能问题
    4: 对应解绑方法为:.unbind()
    

    2: .live()
    .live方法的用法是这样的:targetElment.live('eventType', eventHandler)
    live()的写法和bind是一样,但是它们的功能和实现原理却不一样,不同点有:

    1: live()把eventHandler绑定在document上,而不是某个特定的元素节点上。它的原理是利用事件冒泡最终代理给最顶层的document。
    2: 对于动态生成的元素也生效(因为eventHandler其实是绑定在document上的)。
    3: jQuery 1.7之后live()就被废弃了,用.on()替代
    4: 对应的解绑方法为 .die()
    

    3: .delegate()
    .delegate方法的用法是这样的:delegatedObject.delegate('targetElment','eventType', eventHandler)
    比方说仍然针对我们开头的那段代码,我们把对

  • 的点击事件,委托给它的父节点
      :

      $('.bookList').delegate('.bookList li','click', function(event){
              $(this).addClass('red');
       })

      .delegate()和live()都用了事件的委托,不用之处在于:

      1: delegate()可以自己选择委托给特定的元素,而不是只能是document
      2: jQuery 1.7之后.delegate()也被废弃了,要用.on()替换
      3: 对应的解绑方法为 .undelegate()
      

      4: .on()
      .on()的语法:delegateObject.on('eventType', 'targetElement', eventHandler)
      jQuery 1.7之后,上面的三个方法都被on取而代之,而用on的不同写法就可以达到跟它们相同的效果:

      // Bind
      $( ".bookList li" ).bind( "click", function( e ) {} ); 
      $( ".bookList li" ).on( "click", function( e ) {} ); 
      
      // Live
      $( ".bookList li" ).live( "click", function( e ) {} );
      $( document ).on( "click", ".bookList li", function( e ) {} ); 
      
      // Delegate
      $( "#bookList" ).delegate( "li", "click", function( e ) {} );
      $( ".bookList" ).on( "click", "li", function( e ) {} ); 
      
  • 你可能感兴趣的:(javascript)