同事写了段JQuey的代码,在某些机器上,会出现IE假死的性能问题。

我测试了一下代码花费的时间,在我的机器上,会花费600多毫秒,但在某些机器上会花费6秒多(10倍的增长),这样就导致了IE的假死。而且发现与IE版本无关,在大多数机器上会都只需要600多毫秒,不过CPU会有10%以上的瞬间提长。

先来看看出问题的代码:

$(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
$("#levelGroup").replaceWith($(html).find("#levelGroup"));
$("#scriptDiv").replaceWith($(html).find("#scriptDiv"));

其实这段代码很简洁,只是将用AJAX取过来的数据替换一部分当前页面的数据,但性能确实不够好。

开始找原因,看看到底是什么慢?

$(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));

将此行代码分拆,逐元素去分析各自花费的时间:
$(".eXtremeTable")  花费20毫秒左右;
$(html).find(".eXtremeTable")  花费200毫秒左右;
replaceWith()  花费10毫秒左右;
不难定位到是由于$(html).find(".eXtremeTable")这种方式引起的。
(这都是在我机器上的测试结果,而且每次可能不完全一样)

简单的可以这样优化:

var newPage=$(html);
$(".eXtremeTable").replaceWith(newPage.find(".eXtremeTable"));
$("#levelGroup").replaceWith(newPage.find("#levelGroup"));
$("#scriptDiv").replaceWith(newPage.find("#scriptDiv"));

但仔细想想,这样仍然会造成在某些机器上2秒以上的时间消耗,照样是不可接受的。

遂采用比较原始的办法,修改源程序如下:

     var tab='<span id=\"data\">';
            var pos=html.indexOf(tab)
            var content=html.substr(pos+tab.length);
            var pos2=content.indexOf('</span>');
            var content=content.substr(0,pos2);
            document.getElementById("data").innerHTML=content;
           // $(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
          
            var counter='<td id=\"counter\" align=\"right\" width=\"300\">';
            pos=html.indexOf(counter)
            content=html.substr(pos+counter.length);
            pos2=content.indexOf('</table>');
            var content=content.substr(0,pos2+'</table>'.length);
            document.getElementById("counter").innerHTML=content;
           // $("#levelGroup").replaceWith($(html).find("#levelGroup"));

            var sel='<div id=\"scriptDiv\" style=\"display:none;\">'
            pos=html.indexOf(sel)
            content=html.substr(pos+sel.length);
            pos2=content.indexOf('</div>');
            var content=content.substr(0,pos2+'</div>'.length);
            document.getElementById("scriptDiv").innerHTML=content;            
           // $("#scriptDiv").replaceWith($(html).find("#scriptDiv"));

现在此段代码花费的时间几乎为0毫秒。

OK,IE再也不假死了。

问题分析:
原因应该就出在jQuery(html)这个方法上,官方文档解释如下:

根据提供的原始 HTML 标记字符串,动态创建由 jQuery 对象包装的 DOM 元素。 
你可以传递一个手写的 HTML 字符串,或者由某些模板引擎或插件创建的字符串,也可以是通过 AJAX 加载过来的字符串。但是在你创建 input 元素的时会有限制,可以参考第二个示例。当然这个字符串可以包含斜杠 (比如一个图像地址),还有反斜杠。当你创建单个元素时,请使用闭合标签或 XHTML 格式。例如,创建一个 span ,可以用 $("<span/>") 或 $("<span></span>") ,但不推荐 $("<span>") 
--------------------------------------------------------------------------------
Create DOM elements on-the-fly from the provided String of raw HTML. 
You can pass in plain HTML Strings written by hand, create them using some template engine or plugin, or load them via AJAX. There are limitations when creating input elements, see the second example. Also when passing strings that may include slashes (such as an image path), escape the slashes. When creating single elements use the closing tag or XHTML format. For example, to create a span use $("<span/>") or $("<span></span>") instead of without the closing slash/tag. 

因为要构建一个完整的DOM,所以需要花费较长的时间。

至于为何在某些机器上出现高达6秒多的时间消耗,百思不得其解,请高手指点!

一次JQuery性能优化实战的更多相关文章

  1. jQuery性能优化指南(转载)

    现在jquery应用的越来越多, 有些同学在享受爽快淋漓coding时就将性能问题忽略了, 比如我. jquery虽在诸多的js类库中性能表现还算优秀, 但毕竟不是在用原生的javascript开发, ...

  2. jQuery性能优化的28个建议

    我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可 ...

  3. 网站性能优化实战——从12.67s到1.06s的故事

    文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...

  4. jQuery:jQuery性能优化28条建议

    http://www.xue5.com/WebDev/jQuery/671700.html 直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将 ...

  5. jquery性能优化的十种方法

    jquery性能优化的十种方法 有时候我们在书写jquery的时候,为了书写代码方便,往往忽略了程序执行过程中,给客户端带来的压力.随之而来的就是在某些低端浏览器或者低端电脑上运行速度缓慢,甚至无法运 ...

  6. jQuery 性能优化技巧

    原文地址:jQuery 性能优化技巧 博客地址:http://www.extlight.com 一.使用最新版本 jQuery 类库 二.合理使用选择器 # 推荐使用 $("#id" ...

  7. jQuery性能优化和技巧

    jQuery性能优化 ①使用最新版本的jQuery类库 ②使用合适的选择器 ③缓存对象 ④循环时的DOM操作 ⑤数组方式使用jQuery对象 ⑥事件代理 ⑦将你的代码转化成jQuery插件 ⑧使用jo ...

  8. 28个jQuery性能优化的建议

    我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可 ...

  9. 小程序Canvas性能优化实战

    以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...

随机推荐

  1. C++静态成员总结(转)

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  2. 【调试】DLL EXE 调试技巧

    0.随便说点 最近因为一些原因一直都没有更新博客,从今天开始要逐渐恢复了,也是对自己的鞭策. 1.本文目标 本文要说在有DLL 和 EXE源码的情况下调试DLL 和 EXE, 工具是VC++2010, ...

  3. Android百度地图开发(三)范围搜索

    // 1.新建项目 将地图API添加进classpath中: 2.在activity_main.xml中添加一个MapView,用来显示地图: <LinearLayout xmlns:andro ...

  4. ansible服务模块和组模块使用

    本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...

  5. js动画框架设计

    当你不再依赖JQuery时,当你已经厌倦了引入js类库实现一些动画效果的方式,当你想实现一个简单而实用的动画框架......下面介绍下愚人设计的动画框架:支持动画缓动算法函数,如Linear.Cubi ...

  6. php时间函数

    PHP中的时间函数有这么些:(1)date用法: date(格式,[时间]);如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:U 替换成从一个起始时间(好象是1970年1 ...

  7. 一行 Python 实现并行化 -- 日常多线程操作的新思路

    春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...

  8. 详解WPF Blend工具中的复合路径功能 ( 含路径标记语法 )

    写此文章的目的是为了简单分析一下 Blend工具中提供的"复合路径"功能.有人在我的博文中留言问我复合路径的问题.  稍微琢磨一下,觉得应该是对的.因此贴出来和大家分享.有不对的说 ...

  9. C#获取文件的绝对路径

    要在c#中获取路径有好多方法,一般常用的有以下五种: //获取应用程序的当前工作目录. String path1 = System.IO.Directory.GetCurrentDirectory() ...

  10. css 简单的 before after 笔记

    元素::first-line  段落得第一行样式 元素::first-letter 第一个字母 元素::first-before {  content:“mayufo”; } contentd的内容插 ...