`

Jquery代码优化细节

阅读更多
id选择器$("#id")
标签选择器$("div")
class选择器$(".class")
伪类选择器$(":input")
属性选择器$("[attr=value]")


1, ID选择器遥遥领先,然后是标签选择器,第三是Class选择器,其他选择器(伪类选择器,属性选择器)都非常慢。



2, 从父元素中选择子元素,最佳选择是$parent.find('.child')。而且,由于$parent往往在前面的操作已经生成,jQuery会进行缓存,所以进一步加快了执行速度。


3,不要过度使用jQuery

jQuery速度再快,也无法与原生的javascript方法相比。所以有原生方法可以使用的场合,尽量避免使用jQuery。
请看下面的例子,为a元素绑定一个处理点击事件的函数:
  $('a').click(function(){
    alert($(this).attr('id'));
  });
获取jquery对象的一个属性的时候,最好使用js的原生方法
这段代码的意思是,点击a元素后,弹出该元素的id属性。为了获取这个属性,必须连续两次调用jQuery,第一次是$(this),第二次是attr('id')。
事实上,这种处理完全不必要。更正确的写法是,直接采用javascript原生方法,调用this.id:
  $('a').click(function(){
    alert(this.id);
  });

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


4. 做好缓存

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

比如,下面这样的写法就是糟糕的写法:  前端UI分享

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

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

更好的写法是:

  var cached = jQuery('#top');

  cached.find('p.classA');

  cached.find('p.classB');

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


5. 使用链式写法

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

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

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



6. 事件的委托处理(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%

8. 少改动DOM结构  前端UI分享
(1)改动DOM结构开销很大,因此不要频繁使用.append()、.insertBefore()和.insetAfter()这样的方法。
如果要插入多个元素,就先把它们合并,然后再一次性插入。根据测试,合并插入比不合并插入,快了将近10倍。
(2)如果你要对一个DOM元素进行大量处理,应该先用.detach()方法,把这个元素从DOM中取出来,处理完毕以后,再重新插回文档。根据测试,使用.detach()方法比不使用时,快了60%。
(3)如果你要在DOM元素上储存数据,不要写成下面这样:
  var elem = $('#elem');
  elem.data(key,value);
而要写成
  var elem = $('#elem');
  $.data(elem,key,value);

根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法是定义在jQuery函数的prototype对象上面的,而$.data()方法是定义jQuery函数上面的,调用的时候不从复杂的jQuery对象上调用,所以速度快得多。(此处可以参阅下面第10点。)

9. 正确处理循环
循环总是一种比较耗时的操作,如果可以使用复杂的选择器直接选中元素,就不要使用循环,去一个个辨认元素。
javascript原生循环方法for和while,要比jQuery的.each()方法快,应该优先使用原生方法。


10. 尽量少生成jQuery对象
每当你使用一次选择器(比如$('#id')),就会生成一个jQuery对象。jQuery对象是一个很庞大的对象,带有很多属性和方法,会占用不少资源。所以,尽量少生成jQuery对象。
举例来说,许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。下面两个例子,都是取出一个元素的文本,使用的都是text()方法。你既可以使用针对jQuery对象的版本:
  var $text = $("#text");
  var $ts = $text.text();
也可以使用针对jQuery函数的版本:
  var $text = $("#text");
  var $ts = $.text($text);
由于后一种针对jQuery函数的版本不通过jQuery对象操作,所以相对开销较小,速度比较快。
分享到:
评论

相关推荐

    简单的jQuery网页画板涂鸦代码.zip

    6. **实现细节**:为了实现涂鸦效果,代码可能创建了一个二维路径,每次鼠标移动时向路径中添加新的点,然后在鼠标抬起时将路径绘制到画布上。此外,可能还涉及到了颜色选择、线条宽度设置等交互元素。 7. **性能...

    jQuery商品放大镜预览代码.zip

    这个"jQuery商品放大镜预览代码.zip"提供的就是一个实现这种效果的JavaScript代码示例,它允许用户在鼠标悬停或点击时,对商品主图进行放大查看,从而提供更丰富的视觉体验和细节展示。以下将详细介绍该代码实现的...

    jQuery代码着色高亮显示特效.zip

    jQuery代码着色高亮显示特效是一种常见的网页开发技术,它能增强代码的可读性和美观性,使得在网页上展示代码样例时更加直观。这个压缩包“jQuery代码着色高亮显示特效.zip”可能包含了一个实现此类效果的示例项目,...

    jquery的日历控件控件代码

    最后,`js日历控件.txt`文件可能是包含了以上代码或者其他日历控件实现的具体细节。如果需要进一步优化或者扩展日历功能,可以查阅该文件的内容,例如添加事件监听、禁用特定日期、添加多语言支持等。 总结起来,...

    仿淘宝门户画报图片相册jQuery代码

    在本项目"仿淘宝门户画报图片相册jQuery代码"中,我们将探讨如何利用jQuery实现一个类似淘宝首页的动态图片相册效果。 这个代码示例的核心目标是创建一个用户体验良好、功能丰富的图片展示平台,类似于淘宝门户中的...

    jQuery Mobile源代码.zip

    它基于 jQuery 和 jQuery UI,提供了丰富的组件、统一的事件处理以及优化的触控交互,使得开发者能够轻松创建跨平台、跨浏览器的移动应用。 首先,我们要理解jQuery Mobile的核心理念。它强调的是“Write Less, Do ...

    TreeView控件全选和全不选的JQuery代码

    以下是一个基本的JQuery代码示例: ```javascript $(document).ready(function() { // 全选按钮的点击事件 $("#selectAll").click(function() { toggleAll(true); }); // 全不选按钮的点击事件 $("#deselect...

    jQuery添加产品分类菜单代码.zip

    4. **CSS样式控制**:为了使菜单美观并符合设计规范,jQuery代码可能会与CSS样式结合使用,通过`addClass()`, `removeClass()`等方法动态地添加或移除CSS类,来改变元素的样式和布局。 5. **AJAX交互**:虽然这个...

    jQuery自由跳动文字代码.zip

    在本案例中,我们使用的是jQuery 1.6.2的最小化版本(jquery.1.6.2.min.js),这是一个广泛使用的稳定版本,提供了丰富的API和优化的性能。 核心代码"beatText.js"中,首先需要通过jQuery的选择器找到要应用动画的...

    简洁易用的jQuery左右对称浮动广告代码.zip

    "简洁易用的jQuery左右对称浮动广告代码"是一个专门针对网页广告设计的jQuery插件,特别适合于创建对联广告,也就是在页面两侧浮动显示的广告条幅。 首先,我们要理解什么是对联广告。对联广告通常是指位于网页两侧...

    75款常用的jquery特效前端网页代码

    【标题】"75款常用的jquery特效前端网页代码"涵盖了jQuery在前端开发中的广泛应用和重要性。jQuery是一款高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计以及Ajax交互等任务,使得前端开发变得...

    jQuery无限滚动加载图片瀑布流代码

    `jQuery.pbl`插件的具体实现细节,包括如何处理Ajax响应数据、如何构建和插入DOM元素、如何实现瀑布流布局等,需要查阅该插件的文档或源代码来获取更多信息。 总结来说,jQuery无限滚动加载图片瀑布流技术是结合了...

    jQuery扁平手风琴代码

    jQuery扁平手风琴是一种常见的网页交互元素,用于呈现可折叠的内容区域,用户可以逐个展开或...在提供的文件"texiao2651_1560680849"中,可能包含了实现这个手风琴效果的具体代码示例,可以参考并学习其中的实现细节。

    基于JQuery的图片放大切换特效

    4. **JQuery代码**:编写JQuery脚本来处理图片的切换和放大效果。这包括: - 监听小图的点击事件。 - 在点击事件触发时,获取被点击图片的源(src)并应用到大图元素。 - 使用JQuery的`.fadeIn()`或`.show()`方法...

    jQuery手机触屏滑动导航代码.zip

    【jQuery手机触屏滑动导航代码】是一种专为移动端设计的交互式菜单导航解决方案,它利用JavaScript库jQuery的强大功能,优化了在触摸设备上的用户体验。这个特效允许用户通过左右滑动手势来浏览导航菜单,提高了...

    jQuery九宫格顺时针抽奖代码.zip

    9. **代码优化**:考虑到性能,代码可能会包含一些优化措施,例如减少DOM操作次数,避免不必要的计算,以及合理地使用缓存等。 总的来说,jQuery九宫格顺时针抽奖代码是一个结合了DOM操作、事件处理、CSS动画和...

    仿京东产品展示jquery代码,缩略图放大

    【标题】"仿京东产品展示jquery代码,缩略图放大" 涉及到的知识点主要集中在前端开发领域,特别是JavaScript库jQuery的应用以及图像展示的交互设计。在这一项目中,开发者试图模仿京东网站上商品展示的方式,实现当...

    jQuery带中奖名单大转盘抽奖代码.zip

    在实际应用中,为了增加用户体验,开发者可能会加入一些细节优化,比如加载提示、结果确认、防止连续抽奖等。加载提示可以在转盘转动时显示,以告知用户程序正在运行;结果确认则让用户确认中奖信息,避免因网络延迟...

    酷我音乐首页jQuery焦点图代码.zip

    这个"酷我音乐首页jQuery焦点图代码"压缩包中的"jiaoben19589"可能是代码示例或者文档的文件名,具体内容需要解压后查看才能进一步了解其具体实现细节。总的来说,这个资源对于学习和使用jQuery创建焦点图是一个很好...

    jQuery蓝色商品分页样式代码.zip

    此外,考虑到兼容性和性能,可能还需要对不同的浏览器进行测试,并优化代码以减少加载时间。 总之,"jQuery蓝色商品分页样式代码"提供了一个优雅的解决方案,可以帮助开发者快速实现一个具有吸引力的商品分页功能,...

Global site tag (gtag.js) - Google Analytics