对jQuery的事件绑定的一些思考

jQuery的事件绑定

问题

首先我们看下面的一个很常见的事件绑定代码:

//example
$(‘#dom‘).click(function(e){
  //do something
});

$(‘#dom2‘).click(function(e){
  //do something
});

这段代码在事件绑定处理上有一些缺陷:

过多的事件绑定会损耗内存

后期生成HTML会没有事件绑定,需要重新绑定

语法过于繁杂

解决方案

对于1、2两点的解决方案,我们首先先了解一下jQuery的事件绑定

jQuery的事件绑定有多个方法可以调用,以click事件来举例:

click方法

bind方法

delegate方法

on方法

不管你用的是(click / bind / delegate)之中那个方法,最终都是jQuery底层都是调用on方法来完成最终的事件绑定。因此从某种角度来讲除了在书写的方便程度及习惯上挑选,不如直接都采用on方法来的痛快和直接。

关于对方法的详细解释和用例,请直接访问jQuery官网,在这里不一一说明。

性能

首先我们需要先对不同的事件绑定方式之间的内存占用差距有一个清晰的认识。

对于性能的分析将采用Chrome的Developer Tools。

Profiles –> Take Heap Snapshot,用这个工具我们可以看到Javascript所占用的内存,能够对性能问题进行分析。

DEMO HTML

<html>
  <head>
    <script type="text/javascript">
      $(function(){
        $(‘#btn-add‘).click(function(){
          $(‘.ul‘).prepend(‘<li><a href="javascript:;">text</a></li>‘);
        });
      });
    </script>
  </head>
  <body>
    <button id="btn-add">Create Element</button>
    <ul class="ul">
      <li><a href="javascript:;">text</a></li>
      <!-- 2000 line... -->
      <li><a href="javascript:;">text</a></li>
    </ul>
  </body>
</html>

Method 1

$(function(){
    $(‘.ul a‘).click(function(e){
        alert(‘click event‘);
    });
});

以下是Method 1的内存分析图

内存占用约3.4M

Method 2

$(function(){
    $(‘.ul‘).on(‘click‘, ‘a‘, function(e){
        alert(‘click event‘);
    });
});

以下是Method 2的内存分析图

内存占用约2.0M

结论

Method 1 明显比 Method 2 多耗1.4M的内存

Method 1 无法将事件绑定到通过点击button所新增DOM中来,而Method 2可以。

只要on的delegate对象是HTML页面原有的元素,由于是事件的触发是通过Javascript的事件冒泡机制来监测,所以对于所有子元素(包括后期通过JS生成的元素)所有的事件监测均能有效,且由于不用对多个元素进行事件绑定(在这个example中为2000+a标签),能够有效的节省内存的损耗。

思考

代码如诗,但很容易变成代码如屎。如何提高代码的优雅程度也是一个很有意思的事情。

以下是一个很普通且普遍的JS文件的代码片段(用于一般网站)

$(‘#btn-add‘).click(function(){
  //do something
});
$(‘.action-box #btn-delete‘).click(function(){
  //do something
});
$(‘.action-box #btn-sort‘).mouseenter(function(){
  //do something
});

毫不夸张的说,当一个js文件上百行后,类似于上面的代码,你很难从里面发现规律。

可能A喜欢写#btn-add,而B喜欢写.action-box #btn-add来作为选择符。

堆砌着许多不同类型事件,没有一个次序可言

没有运用到我们刚刚所讲的利用事件冒泡来做事件绑定

改进

我们来一步步改进一下之前的JS代码

Version 1

$(‘.action-box‘).on(‘click‘, ‘#btn-add‘, function(){
  //do something
});
$(‘.action-box‘).on(‘click‘, ‘#btn-delete‘, function(){
  //do something
});

虽然运用了事件冒泡,不过感觉还是有点累赘,.action-box出现多次,感觉不舒服,让我们继续改进

Version 2

$(‘.action-box‘).on(‘click‘, ‘#btn-add, #btn-delete‘, function(){
  if($(this).attr(‘id‘) == ‘btn-add‘){
    //do something
  } else{
    //do something
  }
});

感觉比刚刚好多了,不过还是需要判断元素来做出相应的处理,能接受,但不完美。

灵感

首先看一下css的增强版本sass对于css语法上面的改进

/*bed css code*/
.action-box { width: 100%; color: #000; }
#btn-add { color: blue; }
#btn-delete { color: red; }

/*good css code*/
.action-box { width: 100%; color: #000; }
  .action-box #btn-add { color: blue; }
  .action-box #btn-delete { color: red; }

/*sass code*/
.action-box {
  width: 100%;
  color: #000;
  #btn-add {
    color: blue;
  }
  #btn-delete {
    color: red;
  }
}

复制代码

我们可以在 good css code 和 sass code 从中可以可以很清晰了然的看到文档结构:.action-box 下面有两个button。

这是否能让sass这种代码结构运用到js中来呢?答案当然是可以。

$(‘.action-box‘).coffee({
  click: {
    ‘#btn-add‘: function(){
      //do something
    },
    //这是是支持jQuery的‘:last / [attr] / :eq(0)‘等方法的
    ‘#btn-delete‘: function(){
      //do something
    }
  },
  mouseenter: {
    ‘#btn-sort‘: function(){
      //do something
    }
  }
});

喜欢这种结构吗?

清晰明了的文档结构

运用事件冒泡,有效减少内存的占用

第一级别用事件名称来划分

第二级别的属性名相当于选择符。

coffee函数的源码

$.fn.coffee = function(obj){
  for(var eName in obj)
    for(var selector in obj[eName])
      $(this).on(eName, selector, obj[eName][selector]);
}

聊聊数行代码,就可以做成一个很美妙的语法糖

Enjoy yourself ! ^_^

如果你觉得这篇文章还不错,请帮忙点击一下推荐,谢谢!

时间: 2024-10-31 00:34:37

对jQuery的事件绑定的一些思考的相关文章

Jquery之事件绑定(bind(),live(),delegate(),on())

1..bind() 描述: 为一个元素绑定一个事件处理程序. .bind()一个基本的用法: $(selector).bind('click', function() { alert('User clicked on "foo."'); }); 可以直接用原生js替代为: $(selector).click( function() { alert('User clicked on "foo."'); }); 在jQuery1.4.3,您现在可以通过传递false代替

jquery 动态事件绑定(0512)

jquery动态事件绑定,父元素需为静态元素,(不能是动态生成): $("#parent").on("click","#child",function(){ //.... });

jQuery中事件绑定

一.前言 最近在做项目中要用到jQuery来绑定事件,首先想到的是$(selector).事件名();这样绑定事件的方式,这种方式对事件进行绑定其实也就是bind()方法,但当选择器匹配的元素过多,$(selector).事件名();对每个元素进行迭代绑定,会影响性能.除了这种方式可以绑定事件以外,还有live()(已过期).delegate().on()方法绑定事件,接下来分析一下它们的区别,以及使用哪种方式最值得推荐.由于live()方法已过期,只分析另外三种,欢迎拍砖.吐槽~~~ 二.用法

了解JQuery的事件绑定特性和事件命名空间机制,编写更好、更灵活的事件处理代码

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件.JQuery支持自定义事件,这显然给编程带来了极大的灵活性.下面就一起学习下,jquery事件处理的一些特性. 1.JQuery中事件可以重复绑定,不会覆盖. $("#button1").bind("click",function(){ alert("func1"); }); $("#button1&qu

jQuery得事件绑定

1. 绑定事件 语法 bind(type,data,fn) 描述:为每一个匹配元素得特定事件绑定一个事件处理器函数. 参数解释: type:事件类型 data:作为event.data属性值传递给事件对象得额外数据对象 fn: 绑定到每个元素的事件上面的处理函数 当每个p标签被点击的时候,弹出其文本 $("p").bind("click", function(){ alert( $(this).text() ); }); 你可以在事件处理之前传递一些附加的数据. f

jquery的事件绑定

jQuery绑定事件的四种方式 jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪些. jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off. bind(type,[data],function(eventObject)) bind是使用

!!!jQuery中事件绑定 推荐使用.delegate()或者live()

jQuery中的.bind()..live()和.delegate()之间区别分析 参考:http://www.jb51.net/article/27309.htm DOM树   首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的HTML页面看起来就像是这个样子 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行. 复制代码代码如下: $('a').bind('click',function(){al

jQuery的事件绑定和解绑

1.绑定事件 $('获取的标签对象').bind('要操作的方法,  {操作的内容  是字典的形式},function(){} ') 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data (Object) : (可选) 作为event.data属性值传递给事件对象的额外数据对象 fn ( Function) : 绑定到每个匹配元素的事件上面的处理函数 示例: 当每个p

jQuery的事件绑定类型

1..bind() 在.bind()绑定事件的时候,这些元素必须已经存在. 2.on()首选的,最灵活的 3.one()为元素的事件添加处理函数.处理函数在每个元素上每种事件类型最多执行一次. 4..delegate() undelegate是用来移除使用.delegate()的方式已经绑定的事件处理程序