同事写了段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")这种方式引起的。(这都是在我机器上的测试结果,而且每次可能不完全一样)简单的可以这样优化:
varnewPage=$(html);
$(".eXtremeTable").replaceWith(newPage.find(".eXtremeTable"));
$("#levelGroup").replaceWith(newPage.find("#levelGroup"));
$("#scriptDiv").replaceWith(newPage.find("#scriptDiv"));但仔细想想,这样仍然会造成在某些机器上2秒以上的时间消耗,照样是不可接受的。遂采用比较原始的办法,修改源程序如下:
vartab='<spanid=/"data/">';
varpos=html.indexOf(tab)
varcontent=html.substr(pos+tab.length);
varpos2=content.indexOf('</span>');
varcontent=content.substr(0,pos2);
document.getElementById("data").innerHTML=content;
//$(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
varcounter='<tdid=/"counter/"align=/"right/"width=/"300/">';
pos=html.indexOf(counter)
content=html.substr(pos+counter.length);
pos2=content.indexOf('</table>');
varcontent=content.substr(0,pos2+'</table>'.length);
document.getElementById("counter").innerHTML=content;
//$("#levelGroup").replaceWith($(html).find("#levelGroup"));
varsel='<divid=/"scriptDiv/"style=/"display:none;/">'
pos=html.indexOf(sel)
content=html.substr(pos+sel.length);
pos2=content.indexOf('</div>');
varcontent=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>")
--------------------------------------------------------------------------------
CreateDOMelementson-the-flyfromthePRovidedStringofrawHTML.
YoucanpassinplainHTMLStringswrittenbyhand,createthemusingsometemplateengineorplugin,orloadthemviaAJAX.Therearelimitationswhencreatinginputelements,seethesecondexample.Alsowhenpassingstringsthatmayincludeslashes(suchasanimagepath),escapetheslashes.WhencreatingsingleelementsusetheclosingtagorXHTMLformat.Forexample,tocreateaspanuse$("<span/>")or$("<span></span>")insteadofwithouttheclosingslash/tag.
因为要构建一个完整的DOM,所以需要花费较长的时间。至于为何在某些机器上出现高达6秒多的时间消耗,百思不得其解,请高手指点!
新闻热点
疑难解答