技术开发 频道

jQuery中文教程之非常好的实践

  4. 不要过度使用jQuery

  jQuery速度再快,也无法与原生的javascript方法相比。所以有原生方法可以使用的场合,尽量避免使用jQuery。

  请看下面的例子,为a元素绑定一个处理点击事件的函数:

  $('a').click(function(){

  alert($(
this).attr('id'));

  });

  这段代码的意思是,点击a元素后,弹出该元素的id属性。为了获取这个属性,必须连续两次调用jQuery,第一次是$(this),第二次是attr('id')。

  事实上,这种处理完全不必要。更正确的写法是,直接采用javascript原生方法,调用this.id:

  $('a').click(function(){

  alert(
this.id);

  });

  根据测试,this.id的速度比$(this).attr('id')快了20多倍。

  5. 做好缓存

  选中某一个网页元素,是开销很大的步骤。所以,使用选择器的次数应该越少越好,并且尽可能缓存选中的结果,便于以后反复使用。

  比如,下面这样的写法就是糟糕的写法:

  jQuery('#top').find('p.classA');

  jQuery(
'#top').find('p.classB');

  更好的写法是:

  var cached = jQuery('#top');

  cached.find(
'p.classA');

  cached.find(
'p.classB');

  根据测试,缓存比不缓存,快了2-3倍。

  6. 使用链式写法

  jQuery的一大特点,就是允许使用链式写法。

  $('div').find('h3').eq(2).html('Hello');

  采用链式写法时,jQuery自动缓存每一步的结果,因此比非链式写法要快。根据测试,链式写法比(不使用缓存的)非链式写法,大约快了25%。

  7. 事件的委托处理(Event Delegation)

  javascript的事件模型,采用"冒泡"模式,也就是说,子元素的事件会逐级向上"冒泡",成为父元素的事件。

  利用这一点,可以大大简化事件的绑定。比如,有一个表格(table元素),里面有100个格子(td元素),现在要求在每个格子上面绑定一个点击事件(click),请问是否需要将下面的命令执行100次?

  $("td").bind("click", function(){

  $(
this).toggleClass("click");

  });

  回答是不需要,我们只要把这个事件绑定在table元素上面就可以了,因为td元素发生点击事件之后,这个事件会"冒泡"到父元素table上面,从而被监听到。

  因此,这个事件只需要在父元素绑定1次即可,而不需要在子元素上绑定100次,从而大大提高性能。这就叫事件的"委托处理",也就是子元素"委托"父元素处理这个事件。

  具体的写法有两种。第一种是采用.delegate()方法:

  $("table").delegate("td", "click", function(){

  $(
this).toggleClass("click");

  });

  第二种是采用.live()方法:

  $("table").each(function(){

  $(
"td", this).live("click", function(){

  $(
this).toggleClass("click");

  });

  });

  这两种写法基本等价。唯一的区别在于,.delegate()是当事件冒泡到指定的父元素时触发,.live()则是当事件冒泡到文档的根元素后触发,因此.delegate()比.live()稍快一点。此外,这两种方法相比传统的.bind()方法还有一个好处,那就是对动态插入的元素也有效,.bind()只对已经存在的DOM元素有效,对动态插入的元素无效。

  根据测试,委托处理比不委托处理,快了几十倍。在委托处理的情况下,.delegate()又比.live()大约快26%。

0
相关文章