`

为IE浏览器的javascript提速

阅读更多

随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势。IE8浏览器的Javascript运行速度虽然相对于IE7以及IE6有着很大的提升,但相对于Webkit引擎的浏览器还是有一定的差距,在去年的ZDNET Javascript测试上Chrome浏览器表现突出,一举击败Firefox、Safari和微软的IE浏览器。不过因为IE浏览器相对庞大的使用人群,我们有必要为IE浏览器的javascript来提提速。

我们知道,浏览器在执行期时是由内到外执行脚本的,那么离我们的脚本最远的全局对象,很可能要跨越几层作用域才能访问到它。不过在IE浏览器中,从最内层到最外层要花的时间比其他多出很多。加之,javascript是一种胶水语言,它必须要调用DOM对能完成我们大多数选择。最著名的就是选择元素(document.getElementById,document.getElementsByTagName,docuemnt.evaluate,document.querySelector),创建元素(document.createElement),此外还有document.body,document.defaultView.getComputedStyle等等,频繁地调用document对象,但是document是位于window对象下,因此这路程就更远了。就了提速,我们必须把它们保存在一个本地变量,那么每次就省得它长途跋涉了。这种技术的运用明显体现在jQuery的源码中:

(function( window, undefined ) {

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
		// The jQuery object is actually just the init constructor 'enhanced'
		return new jQuery.fn.init( selector, 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,

        //====================省=================
       }
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;

})(window);

 

把window传进闭包内,就省得它每次都往外找window了。

再看其他类库

//Raphael
window.Raphael = (function () {
    var separator = /[, ]+/,
        elements = /^(circle|rect|path|ellipse|text|image)$/,
        doc = document,
        win = window,
//************略**************//dojo
d.global = this;//Ext
DOC = 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')@*/<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>javascript提速技术 by 司徒正美</title>

<script type=”text/javascript”>

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
</body>
</html>

 

运用提速技术后:

<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>javascript提速技术 by 司徒正美</title>

<script type=”text/javascript”>
/*@cc_on _d=document;eval(’var document=_d’)@*/

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!!!
</body>
</html>

 

经测试,用了提速技术后,IE的性能比较

 

IE6   document document.getElementById document.title
没有使用提速技术 485 1110 1219
使用提速技术后 109 609 656

 

IE8   document document.getElementById document.title
没有使用提速技术 468 797 843
使用提速技术后 78 328 407

 

我们看一下实现原理:

document;
doc;      //很明显,调用这个比直接document快,document还要钻进window内部找一番如何劫持它呢?

var doc = document;
var document = doc;这样明显不行因为在预编译阶段,var变量会提前,上面代码相当于

var doc
var document  //这里被劫持了
doc = document //注意,document已经变成undefined
document = doc //相当于window.undefined = undefined没有办法,只好在执行期才定义这个document变量,javascript的动态解析技术派上用场了,eval就是其代表之一。

var doc = document;
eval('var document = doc');为了让IE专用,用了IE特有的条件编译。

/*@cc_on
var doc = document;
eval('var document = doc');
@*/嘛,window的东西其实蛮多,我们一一把它们变成本地变量又如何?

/*@cc_on
eval((function(props) {
  var code = [];
  for (var i = 0 l = props.length;i<l;i++){
    var prop = props[i];
    window['_'+prop]=window[prop];
    code.push(prop+'=_'+prop)
  }
  return 'var '+code.join(',');
})('document event body location title self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' ')));
@*/

 

我们可以再扩展一下,让其更多全局变量或全局方法局部化。不过经验测,FF使用它会报错,chrome则慢了,其他浏览器不明显。

        if( !+"v1"  ){
          var code = [],ri = 0,prop,str = "var "
          for(var a in window)
            code[ri++] = a;
          for (var i = 0 ,n = code.length;i<n;i++){
            var prop = code[i]
            window['_'+prop] = window[prop];
            str += prop+'=_'+prop+","
          }
          str = str.slice(0,-1);
          eval(str)
        }<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>javascript提速技术 by 司徒正美</title>

<script type=”text/javascript”>
var __chrome = navigator.userAgent.indexOf(”Chrome”) !== -1;
var __firefox = !!window.Components

if( !__chrome & !__firefox ){

var code = [],ri = 0,prop,str = “var ”
for(var a in window)
code[ri++] = a;
for (var i = 0 ,n = code.length;i<n;i++){
var prop = code[i]
window['_'+prop] = window[prop];
str += prop+’=_’+prop+”,”
}
str = str.slice(0,-1);
eval(str)
}
var date = new Date;
for (var i = 0; i < 100000; i++)
document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!
</body>
</html>

 

分享到:
评论

相关推荐

    为IE浏览器的javascript提速.docx

    总的来说,为IE浏览器的JavaScript提速主要涉及以下几个方面: 1. 缓存全局对象,如`window`和`document`,使用局部变量引用。 2. 减少DOM操作,尤其是在循环中避免频繁查询或修改DOM。 3. 针对IE特性进行优化,如...

    谷歌浏览器js打开IE浏览器.rar

    本示例“谷歌浏览器js打开IE浏览器.rar”提供了一个解决方案,它允许用户在谷歌浏览器(Chrome)中通过JavaScript代码启动IE浏览器。这主要适用于那些需要在现代浏览器环境下触发旧版IE兼容模式的场景。 JavaScript...

    谷歌浏览器跳转到ie浏览器.rar

    5. **兼容性处理**:由于IE浏览器和现代浏览器在处理某些JavaScript特性、CSS样式以及API调用上有差异,中转站页面可能需要针对IE进行特别的兼容性优化,以确保在所有目标浏览器中都能正常工作。 6. **安全考虑**:...

    IE浏览器源码

    "IE浏览器源码" 指的是Internet Explorer浏览器的源代码,这是一个由微软公司开发的曾经广泛使用的网页浏览软件。其源码是实现浏览器功能的底层编程语言,包括HTML解析、JavaScript执行、网络通信、渲染引擎等多个...

    ie浏览器 js调用 ocx 异步打印pdf、图片控件

    在“ie浏览器 js调用 ocx 异步打印pdf、图片控件”的场景中,我们将探讨如何利用JavaScript调用OCX控件来实现异步打印功能,特别是针对PDF和图片文件。 首先,我们需要在Web服务器上部署这个OCX控件。部署过程包括...

    FireFox Chrome IE浏览器调试JavaScript

    ### FireFox Chrome IE浏览器调试JavaScript #### 一、Firebug简介 Firebug是一款专为Firefox浏览器设计的强大开发插件,自推出以来便受到广大Web开发者的喜爱与推崇。随着Web技术的发展,对Web开发人员的要求...

    java调用IE浏览器

    下面将详细介绍如何使用Java调用IE浏览器,并支持其他浏览器以及自定义打开的内容。 首先,`java.lang.Runtime`类是Java平台的标准API,它可以提供与操作系统交互的能力。调用浏览器的一个基本方法是通过`Runtime....

    IE浏览器源码.rar易语言源码

    在【压缩包子文件的文件名称列表】中,我们看到一个名为"IE浏览器源码.e"的文件,这很可能是整个项目的主要源代码文件或者是一个包含了所有源代码的入口文件。在易语言中,".e"后缀通常代表易语言的工程文件,里面...

    在线浏览PDF文件、可兼容IE浏览器

    标题中的“在线浏览PDF文件、可兼容IE浏览器”意味着我们将探讨如何在网页环境中,特别是对Internet Explorer(IE)浏览器支持的情况下,实现PDF文件的在线预览。这在现代Web开发中是一个常见需求,因为PDF文档广泛...

    IE与非IE浏览器调用PC摄像头拍摄并且上传

    这个话题涉及到不同浏览器的API支持和兼容性问题,尤其是IE与其他非IE浏览器之间的差异。以下是关于这一主题的详细讲解。 一、WebRTC API WebRTC(Web Real-Time Communication)是实现浏览器之间实时通信的一组...

    IETest(IE浏览器集合)

    **IETest(IE浏览器集合)** IETest是一款强大的网页兼容性测试工具,它集成了从Internet Explorer 6到Internet Explorer 9等多个版本的浏览器内核,为开发者和设计师提供了一个便捷的环境来测试网站在不同IE版本下...

    Ie浏览器调用

    【Ie浏览器调用】是关于在Internet Explorer(简称IE)浏览器中操作和利用插件进行功能扩展的技术主题。在互联网早期,IE是市场份额最大的浏览器,因此开发针对IE的插件成为了许多开发者的重要任务,以增强用户体验...

    ie不执行javascript修复

    ie不执行javascript修复ie不执行javascript修复ie不执行javascript修复 当IE不能正常运行时,打开该工具就可以了,自动修复

    谷歌浏览器中打开IE浏览器插件

    openIE

    pdfjs预览插件,兼容IE浏览器

    对于标题提到的"pdfjs预览插件,兼容IE浏览器",这意味着我们讨论的是如何在Internet Explorer(IE)这种已经较为老旧且对现代Web标准支持不足的浏览器上,利用PDF.js实现PDF文档的预览功能。 PDF.js的核心在于其跨...

    新版IE浏览器源代码

    "新版IE浏览器源代码" 提供了一个深入了解浏览器内部工作原理的机会,特别是对于那些对前端开发、浏览器内核或者系统级编程感兴趣的开发者而言。这个资源可能包含了构建和修改IE浏览器功能的原始代码。 描述中提到...

    [资源分享]解决Win10下IE浏览器树形控件treeview无法显示的问题

    总之,解决Win10下IE浏览器树形控件无法显示的问题需要综合考虑浏览器兼容性、ActiveX设置、JavaScript和CSS代码、以及可能的资源路径问题。通过逐步排查和测试,通常可以找到问题的根源并予以修复。同时,随着现代...

    基于MFC的ie浏览器源代码

    **基于MFC的IE浏览器源代码详解** 在编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,它使得开发者能够更容易地使用Windows API来开发应用程序。本篇文章将深入探讨如何利用MFC来实现一个...

    ie浏览器插件(页面数据抓取)

    总的来说,ie浏览器插件(页面数据抓取)是一种强大的工具,它结合了JavaScript的灵活性和浏览器的便利性,让数据获取和处理变得简单易行。通过熟练掌握这类插件的使用,我们可以更高效地利用互联网上的海量信息。

    支持IE浏览器调试js调试插件

    本文将详细介绍一款专为IE浏览器设计的JS调试插件及其使用方法。 首先,我们要理解为什么IE浏览器需要特定的JS调试工具。与其他现代浏览器如Chrome、Firefox相比,IE在处理JavaScript时可能有不同的行为。例如,它...

Global site tag (gtag.js) - Google Analytics