广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何优化jQuery代码
  • 944
分享到

如何优化jQuery代码

2024-04-02 19:04:59 944人浏览 独家记忆
摘要

本篇文章给大家分享的是有关如何优化Jquery代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需要优化的代码大致是这样的,也不方便直接把人家

本篇文章给大家分享的是有关如何优化Jquery代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

需要优化的代码大致是这样的,也不方便直接把人家的代码复制过来,就大概地表达下意思:

$.fn.beautifyTable = function(options) {  //定义默认配置项,再用options覆盖  return this.each(function() {  var table = $(this),  tbody = table.children('tbody'),  tr = tbody.children('tr'),  th = tbody.children('th'),  td = tbody.children('td');  //单独内容的class  table.addClass(option.tableClass);  th.addClass(options.headerClass); //1  td.addClass(options.cellClass); //2  //奇偶行的class  tbody.children('tr:even').addClass(options.evenRowClass); //3  tbody.children('tr:odd').addClass(options.oddRowClass); //4  //对齐方式  tr.children('th,td').CSS('text-align', options.align); //5  //添加鼠标悬浮  tr.bind('mouseover', addActiveClass); //6  tr.bind('mouseout', removeActiveClass); //7  //点击变色  tr.bind('click', toggleClickClass); //8  });  };

总的来说,这段代码不错,思路清晰,逻辑明确,想要做什么也通过注释说得很明白了。但是按作者的说法,当表格中有120行时,IE已经反映脚本运行时间过长了。显然从表现来看,这个函数的效率不高,甚至说极其低下。

寻找原因

于是,开始从代码层面进行分析,这是一个标准的jQuery插件式的函数,有个典型的return this.each(function() { ... };);形式的代码,如果作者写下这段代码的时候,不是照本宣科不经思考的话,就应该意识到jQuery的一个函数干了什么事。

简单来说,jQuery.fn下的函数,绝大部分是一个each的调用,所谓each,自然是对选择出来的元素进行了遍历,并对某个元素进行了指定的操作。那么看看上面一段代码,进行了多少的遍历,在此就假设只选择了120行,每一行有6列,另加上1行的表头吧:

  • ·  遍历th,添加headerClass,元素数为6。

  • ·  遍历td,添加cellClass,元素数为6*120=720。

  • ·  从所有tr中找出奇数的,需要对所有tr进行一次遍历,元素数为120。

  • ·  遍历奇数的tr,添加evenRowClass,元素数为120/2=60。

  • ·  从所有tr中找出偶数的,需要对所有tr进行一次遍历,元素数为120。

  • ·  遍历偶数的tr,添加oddRowClass,元素数为120/2=60。

  • ·  遍历所有th和td,添加text-align,元素数为120*6+6=726。

  • ·  遍历所有tr,添加mouseover事件,元素数为120。

  • ·  遍历所有tr,添加mouseout事件,元素数为120。

  • ·  遍历所有tr,添加click事件,元素数为120。

为了方便,我们简单地假设,在遍历中访问一个元素耗时为10ms,那么这个函数一共用了多少时间呢?这个函数共遇上了2172个元素,耗时21720ms,即21秒,显然IE确实应该报脚本执行过久了。

基本优化

知道了效率低下的原因,要从根本上进行解决,自然要想方设法来合并循环,初略一看,按照上边代码中注释里的数字,至少以下几点是可以合并的:

  • ·  3和4可以合并为一次循环,从120+60+120+60变为120,减少了240。

  • ·  1、2和5可以合并为一次循环,从6+720+726变为726,减少了726。

  • ·  6、7、8可以合并为一次循环,从120+120+120变为120,减少了240。

  • ·  进一步的,3、4和6、7、8一样可以合并为一次循环,继续减少了120。

累加一下,我们一共减少了240+726+240+120=1326次元素操作,总计13260ms。在优化之后,我们的函数耗时变为21720-13260=8460ms,即8s。

注意选择器

到这里可能会有一个疑问,从表格的结构上来说,所有的th和td元素肯定都在tr之内,那么为什么不将1、2、5这三步的循环同样放到对tr的循环中,形成一个嵌套的循环,这样不是更加快速吗?

这里之所以没有这么做,主要有2个原因:

其一,无论将1、2、5这三者放在哪里,都不会减少对所有th和td元素的一次访问。

另一方面,$('th,td')这个选择器,在sizzle中会被翻译成2次getElementsByTagName函数的调用,***次获取所有th,第二次获取所有td,然后进行集合的归并。由于getElementsByTagName是内置函数,在此可以认为该函数是不带循环的,即复杂度为O(1),同样集合的归并使用Array的相关函数,是对内存的操作,复杂度同样为O(1)。

反之,如果在对tr元素的循环中再采用$('th,'td)这个选择器,则是在tr元素上调用2次getElementsByTagName,由于无论在哪个元素上调用该函数,函数执行的时间是相同的,因此在循环tr时使用,反而多出了119*2次的函数调用,效率不升反降。

可见,对sizzle选择器的基本知识,也是帮助优化jQuery代码的很重要的一方面。

不要啥都让JavaScript来做

根据前面的基本的优化,已经将时间从21秒降到了8秒,但是8秒这个数字显然是无法接受的。

再进一步分析我们的代码,事实上,循环遍历是语言层面上的内容,其速度应该是相当快的。而针对每个元素所做的操作,是jQuery提供的函数,相比遍历来说,才是占去大部分资源的主子。如果说遍历中访问元素用时是10ms的话,不客气地说执行一个addClass至少是100ms级别的消耗。

因此,为了进一步地优化效率,就不得不从减少对元素的操作入手。再仔细地回审代码,发现这个函数有着非常多的对样式的修改,其中至少包括了:

  • ·  给所有th加上class。

  • ·  给所有td加上class。

  • ·  给tr分奇偶行加上class。

  • ·  给所有th和td加上一个text-align样式。

而事实上我们知道,CSS本身就拥有子代选择器,而浏览器原生对CSS的解析,效率远远高于让javascript去给元素一一加上class。

所以,如果对CSS是可控的,那么这个函数就不应该拥有headerClass、cellClass这两个配置项,而是尽可能地在CSS中进行配置:

.beautiful-table th {  }  .beautiful-table td {  }

再者,对于tr的奇偶行样式,在部分浏览器下可以使用:nth-child伪类来实现,这方面可以利用特性探测,仅在不支持该伪类的浏览器中使用addClass添加样式。当然如果你仅仅想对IE系列进行优化的话,这一条可以忽略了。

对于:nth-child伪类的探测,可以用以下的思路来进行:

  • ·  创建一个stylesheet,再创建一条规则,如#test span:nth-child(odd) { display: block; }。

  • ·  创建相应的html结构,一个id为test的div,内部放置3个span。

  • ·  将stylesheet和div一同加入的DOM树中。

  • ·  查看第1和第3个span的运行期display样式,如果是block,则表明支持该伪类。

  • ·  删除创建的stylesheet和div,别忘了缓存探测的结果。

***,对于给所有th和td元素添加text-align样式,也是可以通过css进行优化的。既然不知道添加的是哪个align,那么就多写几个样式:

 .beautiful-table-center th,.beautiful-table-center td { text-align: center !important; }  .beautiful-table-right th,.beautiful-table-right td { text-align: right !important; }  .beautiful-table-left th,.beautiful-table-left td { text-align: left !important; }   table.addClass('beautiful-table-' + options.align);

当然,上面所说的优化,是建立在对CSS有控制权的情况下的,如果本身无法接触到CSS样式,比如这是一个通用的插件函数,会被完全无法控制的第三方使用,那么怎么办呢?也不是完全没有办法:

  • ·   去找页面里的所有CSS规则,比如document.styleSheets。

  • ·   遍历所有规则,把配置项中的headerClass、cellClass等拿出来。

  • ·   提取需要的几个class中的所有样式,再自己组装成新的选择器,如beautiful-table th。

  • ·   使用创建出来的选择器,生成新的stylesheet,加入到DOM树中。

  • ·   那么只给table加上beautiful-table这个class就搞定了。

当然上面的做法其实也蛮消耗时间的,毕竟又要遍历stylesheet,又要创建stylesheet。具体是不是对效率提升有很大的帮助,则依据页面的规模会有不同的效果,是否使用就要看函数设计人员的具体需求了,这里也就是提一种策略。

总的来说,通过尽可能少地执行javascript,将更多的样式化的任务交给CSS,则浏览器的渲染引擎来完成,又可以进一步地优化该函数,假设对addClass、css的调用需要100ms的话,此次优化直接消灭了原有120+726=846次的操作,节约了84600ms的时间(当然有夸张的成分,但是对整个函数的消耗来说,这个确实是很大的一块)。

***的补充

这篇文章,仅仅是想在jQuery的各个实现的层面上来进行优化,只涉及到了对jQuery整个运行过程的分析、细节介绍和优化方向,并没有提到一些基本之基本的优化方法,比如:

先将整个table从DOM树中移除,完成所有的操作之后再放回DOM,减少repaint。

将mouseover和mouseout改为mouseenter和mouseleave,减少因为下正确的事件冒泡模型导致的重复的事件函数的执行。

对于th、td之类单纯元素的选择,优先考虑使用原生的getElementsByTagName,消灭sizzle分析选择器的时间。

***,这篇文章只是想说明,对于前端开发人员,虽然浏览器可能是个黑盒,但是很多框架工具、库都是开放的,在使用之前如果可以进行一定程度的了解,必然有助于个人的技术提升和最终产品的质量优化,“知其然而不知其所以然”是非常忌讳的情况。

以上就是如何优化jQuery代码,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网JavaScript频道。

--结束END--

本文标题: 如何优化jQuery代码

本文链接: https://www.lsjlt.com/news/66350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何优化jQuery代码
    本篇文章给大家分享的是有关如何优化jQuery代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需要优化的代码大致是这样的,也不方便直接把人家...
    99+
    2022-10-19
  • 如何优化Python代码
    如何优化Python代码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。优化是什么首先定义什么是优化。我们将使用一个直观的示例进行此操作。这是我们的问题:假设给定一个数组,其...
    99+
    2023-06-16
  • 如何优化PHP代码
    这篇文章主要介绍了如何优化PHP代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言这是一个后台用户列表的搜索功能搜索条件可否并行是否必填...
    99+
    2022-10-19
  • CSS代码如何优化
    小编给大家分享一下CSS代码如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!div+css代码优化方案介绍-css代码优化...
    99+
    2022-10-19
  • JS如何优化代码
    这篇文章主要介绍了JS如何优化代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、松耦合当修改一个组件而不需要更改其他组件时,就做到了松耦...
    99+
    2022-10-19
  • jQuery基本事件代码优化的示例分析
    这篇文章主要介绍了jQuery基本事件代码优化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。事件模型说到事件,就要追溯到网景与微软...
    99+
    2022-10-19
  • 怎么理解jQuery代码优化的基本事件
    这篇文章主要介绍“怎么理解jQuery代码优化的基本事件”,在日常操作中,相信很多人在怎么理解jQuery代码优化的基本事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2022-10-19
  • 网站代码如何优化
    小编给大家分享一下网站代码如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  众所周知,现如今从搜索引擎的角度出发,我们都提倡使用div+css来布局网站,...
    99+
    2023-06-10
  • 如何优化CSS代码写法
    今天就跟大家聊聊有关如何优化CSS代码写法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。众所周知,SEO优化很重要的一点就是布局,而DIV+CSS布...
    99+
    2022-10-19
  • 如何优化Javascript前端代码
    这期内容当中小编将会给大家带来有关如何优化Javascript前端代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出...
    99+
    2023-06-14
  • 如何优化JS代码来适合网站优化
    这期内容当中小编将会给大家带来有关 如何优化JS代码来适合网站优化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 如何优化JS代码来适合网站优化?现在优化JS代码也是我们在进行网站优化时经常使用...
    99+
    2023-06-07
  • 如何优化Python代码的性能
    如何优化Python代码的性能Python作为一种高级编程语言,其易学易用的特点使其成为了很多开发者的首选。然而,由于Python是一种解释型语言,其执行速度相对较慢,特别是在处理大数据集或者复杂算法时。因此,对于需要高性能的应用场景,我们...
    99+
    2023-10-22
    代码性能提升 Python性能优化 提高Python执行效率
  • Vue3如何用CompositionAPI优化代码量
    这篇文章主要介绍了Vue3如何用CompositionAPI优化代码量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3如何用CompositionAPI优化代码量文章都会有所收获,下面我们一起来看看吧。我...
    99+
    2023-07-04
  • 如何优化C++代码的性能?
    如何优化C++代码的性能随着计算机技术的发展,对于软件性能的追求也日益增加。在C++编程中,优化代码的性能是一个非常重要的任务。本文将介绍一些优化C++代码性能的方法和技巧,帮助读者了解如何提高程序的运行效率。第一步是对代码进行合理的设计。...
    99+
    2023-11-02
    性能优化 代码优化 C++编程
  • jQuery如何优化选择符
    小编给大家分享一下jQuery如何优化选择符,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!优化选择符例如,Id选择符应该是唯一的...
    99+
    2022-10-19
  • 如何用C语言优化Python代码
    这篇“如何用C语言优化Python代码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用C语言优化Python代码”文章吧...
    99+
    2023-06-17
  • PHP和NumPy:如何优化你的代码?
    在当今的计算机世界中,高效的代码是非常重要的。对于PHP和NumPy这两种编程语言来说,代码优化也是必不可少的。在本文中,我们将讨论如何使用PHP和NumPy来优化你的代码。 使用PHP的缓存机制 PHP是一种解释型语言,每次运行脚本...
    99+
    2023-09-11
    numpy path numy
  • JavaScript多级判定代码如何优化
    本篇内容介绍了“JavaScript多级判定代码如何优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、场景业务代码里, 一次操作可能会前...
    99+
    2023-07-05
  • Python 容器:如何优化你的代码?
    Python 是一门强大的编程语言,拥有丰富的容器类型,包括列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary)。这些容器类型可以存储不同类型的数据,并且具有不同的功能和优势。在 Python 编程中,使用容器...
    99+
    2023-07-02
    容器 http shell
  • PHP如何优化单元测试代码
    这篇文章将为大家详细讲解有关PHP如何优化单元测试代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、单元测试通过实现单一责任原则(我们的代码应该只关注功能的单个部分),我们将确保在测试期间,我们只会同...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作