在乐享AI咨询 →
技术支持

为IE浏览器的javascript提速-联想乐享知识库

⚡ 核心结论

本文来源联想官方,解答关于 为IE浏览器的javascript提速 的常见问题,包括:IE浏览器JavaScript执行速度慢怎么办、IE浏览器中如何提升document对象的访问速度等。

内容来源:联想官方

为IE浏览器的javascript提速 问题:浏览器 解决方案: 本文内容主要为部分开发专业人士提供参考。 随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势。IE8浏览器的Javascript运行速度虽然相对于IE7以及IE6有着很大的提升,但相对于Webkit引擎的浏览器还是有一定的差距,在去年的ZDNET Javascript测试上Chrome浏览器表现突出,一举击败Firefox、Safari和微软的IE浏览器。不过因为IE浏览器相对庞大的使用人群,我们有必要为IE浏览器的javascript来提提速。 我们知道,浏览器在执行期时是由内到外执行脚本的,那么离我们的脚本最远的全局对象,很可能要跨越几层作用域才能访问到它。不过在IE浏览器中,从最内层到最外层要花的时间比其他多出很多。加之,javascript是一种胶水语言,它必须要调用DOM对能完成我们大多数选择。最著名的就是选择元素(document.getElementByIddocument.getElementsByTagNamedocuemnt.evaluatedocument.queryS E L E C Tor),创建元素(document.createElement),此外还有document.body,document.defaultView.getComputedStyle等等,频繁地调用document对象,但是document是位于window对象下,因此这路程就更远了。就了提速,我们必须把它们保存在一个本地变量,那么每次就省得它长途跋涉了。这种技术的运用明显体现在jQuery的源码中: (function( window undefined ) {// Define a local copy of jQueryvar jQuery = function( S E L E C Tor context ) { // The jQuery object is actually just the init constructor ''enhanced'' return new jQuery.fn.init( S E L E C Tor context ); } // Map over jQuery in case of overwrite _jQuery = window.jQuery // Map over the $ in case of overwrite _$ = window.$ // Use the correct document accordingly with window argument (sandbox) document = window.document //====================省================= }// Eose jQuery to the global objectwindow.jQuery = window.$ = jQuery;})(window); 把window传进闭包内,就省得它每次都往外找window了。 再看其他类库: //Raphaelwindow.Raphael = (function () { var separator = /[ ]+/ elements = /^(circle|rect|path|ellie|text|image)$/ doc = document win = window// //dojod.global = this; //ExtDOC = document //YUI// } else if (i == ''win'') { c[i] = o[i].contentWindow || o[i]; c.doc = c[i].document;//*Y.config = { win: window || {} doc: document 但是如果你没有引入类库,如果让IE的javascript跑得更快些呢?用一个变量把它储存起来?在一个国外的博客看到一种很厉害的劫持技术,偷龙转凤把全局变量document变成一个局部变量。 /@cc_on _d=document;eval(''var document=_d'')@/ < html dir="ltr" lang="zh-CN">< head>< meta charset="utf-8"/>< title>javascript提速技术 by 司徒正美 </span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;">var date = new Date;<br/>for (var i = 0; i < 100000; i++) document;</span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;">alert(new Date - date);</span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;"> < body>< /body>< /html> 运用提速技术后: < html dir="ltr" lang="zh-CN">< head>< meta charset="utf-8"/>< title>javascript提速技术 by 司徒正美 <br/>/@cc_on _d=document;eval(&#39;&#39;var document=_d&#39;&#39;)@/</span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;">var date = new Date;<br/>for (var i = 0; i < 100000; i++) document;</span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;">alert(new Date - date);</span></p><p><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39

常见问题解答

IE浏览器JavaScript执行速度慢怎么办

IE浏览器(特别是IE8)的JavaScript引擎在访问全局对象(如document、window)时需跨越多层作用域,性能开销显著高于Webkit内核浏览器。解决方法:将频繁使用的全局对象(如document)缓存为局部变量,避免每次重复查找。例如,在脚本开头添加条件编译语句/*@cc_on _d=document;eval('var document=_d')@*/,可将document劫持为局部变量;或手动声明var doc = document;后续统一使用doc。注意:该技术仅适用于IE,且必须置于所有依赖document的代码之前,否则可能引发引用错误。

IE浏览器中如何提升document对象的访问速度

IE浏览器访问document等全局DOM对象时需逐层向上查找作用域链,耗时远超其他浏览器。提速核心是减少作用域链查找深度:将document赋值给局部变量(如var doc = document;),后续所有操作(如doc.getElementById、doc.createElement)均使用该变量。更高级方案是利用IE特有的条件编译指令/*@cc_on _d=document;eval('var document=_d')@*/,在运行时将全局document重定义为局部变量。操作步骤:1. 将该语句置于HTML的<head>内script标签最上方;2. 确保其位于所有调用document的JS代码之前;3. 验证页面无document未定义报错。此方法在jQuery等主流库中已被广泛采用。

⚠️ 注意事项:
1. 该优化仅针对旧版 IE 浏览器,现代浏览器无需此操作且可能产生冲突。
2. 修改全局对象作用域可能影响第三方库的正常运行,建议在独立作用域内使用。
3. 条件编译语法非标准 JS 规范,维护时需注意兼容性说明。