`
varsoft
  • 浏览: 2510042 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

效率!效率!效率!

阅读更多
原著:Mark Davis翻译:onefi 2004年4月21日

<style type="text/css"> <!-- .tabletxt { font-size: 14px; padding: 7px; } .titletxt { font-family: "黑体"; font-size: 20px; } --> </style> 摘要:

此篇文章包括了一些在网页设计中时常用到的脚本。我们可以清晰的体会到其中的执行速度。这将有助于提高您的动态网页的速度。


导言:

自从有了IE4.0以后,我们所看到的网页一天一天的栩栩如生。可以说IE4时代的到来,是我们的眼界更加的宽广了。我们应用IE4,从中我们得到的好处是,可以在自己的个人站点上加入更多的图片、动画、网页特效,以此来体现我们的个性。强大的DHTML技术使得网页会有非同寻常的变化。甚至在某些时刻,运用这项技术可以我们可以模仿很多东西---比如说Windows的界面、Flash的动态效果---当然前提是您需要掌握这项技术。DHTML还有一个非常有意思的地方就是,通常同一种功能,它提供了不止一种的实现形式。换句话说也就是我们可以用不同的代码来实现同样的功能。但这就有执行效率的问题了,而这篇文章,我们讨论的就是这个东西。


DHTML网页中的变化:


一条最基本的更新动态网页的方法改变你网页上的内容。客户端的脚本,您可以使用DHTML object model或者W3C document object model(DOM)来为网页上添加新的元素。无论您何时改变动态网页,浏览器总是首先来识别网页内在的表示,然后会重新计算展现在客户端的网页的内容的具体的尺寸。如果您希望在网页上新加入一块新的内容,那么此时HTML语法分析器是需要被调用的,此时必然会带来一部分多余的开销。您可以使用insertAdjacentHTMLpasteHTML两种方法,以及innerHTMLouterHTML两种属性来在网页上添加新的内容文字。

方法一:改变HTML文字所使用的脚本,最好放在同一个脚本函数中。如果设计的时候一定要使用不同的脚本函数,比如当调用onmouseover和onmouseout这样一类的事件的时候,使你的脚本在一处出现最好。

这里需要大家知道的是,每当页面执行一个脚本函数,HTML编译器总是要重新计算现有的文字的格式,以及各自在网页中的位置。这样您或许就清楚为什么要把脚本都写在一个脚本函数中。(当然同样我也不希望,您改变您现在调用很多函数的代码书写风格。)

方法二:当需要改变文档内容的时候,使用一个HTML的字符串型的变量来代替所有需要修改的内容,进行一次修改,而不是一次一次的来改变文档的内容。如果不需要HTML的目录,这时候可以考虑使用innerText属性。

在下面的例子中,“慢”的例子的执行过程是每次在文档中添加新的文字内容,都令HTML编译器调用一次innerText属性。加快网页速度,“快”的例子只调用了一次innerText属性。
点击进入演示页面

慢:

divUpdate.innerHTML = "";

for ( var i=0; i<100; i++ )

 {

  divUpdate.innerHTML += "<SPAN>这是慢的方法! </SPAN>";

 }

快:

var str="";

for ( var i=0; i<100; i++ )

 {

  str += "<SPAN>快是因为使用了字符串! </SPAN>";

 }

divUpdate.innerHTML = str;

需要更多信息,请参考Dynamic Content


关于innerText的讨论:

在DHTML对象模型中,HTML文档的文字内容的添加都是通过innerText来完成的。然而同样,W3C DOM也提供了一个来实现在一功能的方法。如果您希望在HTML文档中添加一个节点,那么,使用DOM中的createTextNode方法可以实现。要达到更好更快的效果,还是推荐使用innerText属性。

方法三:使用innerText属性来改变您的文档内容。

在下面的示例中,展现了如何使用innerText属性来提高网页的效率。
点击进入演示界面

慢:

var node;

for (var i=0; i<100; i++)

 {

  node = document.createElement( "SPAN" );

  node.appendChild( document.createTextNode( " Using createTextNode() " ) );

  divUpdate.appendChild( node );

 }

快:

var node;

for (var i=0; i<100; i++)

 {

  node = document.createElement( "SPAN" );

  node.innerText = " Using innerText property ";

  divUpdate.appendChild( node );

 }


使用DOM来添加单独的节点:

前面我们已经提到过,为HTML文档中的添加新的内容,是要调用HTML编译器的,所以在这期间,必然会有效率上的损失。所以,在添加新的节点的时候,我们联合调用createElementinsertAdjacentElement方法,而不是仅仅调用一次insertAdjacentElement方法。

方法四:调用createElement和insertAdjacentElement方法,比调用insertAdjacentHTML方法快。

调用insertAdjacentHTML方法,可能会使您的代码看起来更加漂亮,但我们不是在这里畅谈艺术。在这里,我们直接通过DOM调用他的方法会变得更加有效。
点击进入演示界面

慢:

for (var i=0; i<100; i++)

 {

  divUpdate.insertAdjacentHTML( "beforeEnd", "<SPAN> Uses insertAdjacentHTML() </SPAN>" );

 }

快:

var node;

for (var i=0; i<100; i++)

 {

 node = document.createElement( "SPAN" );

 node.innerText = " Uses insertAdjacentElement() ";

 divUpdate.insertAdjacentElement( "beforeEnd", node );

 }

在SELECT中添加新的选择项:

通常我们在动态网页的需求当中,会碰到需要在下拉菜单中添加新的选择项,但一般情况下我们只需要添加一两个就可以解决问题,这个时候我们能够做到就可以了。但是如果需要添加成百上千个选择项怎么办?这时候我们需要使用innerHTML方法而不是为每个需要添加的选项调用一次createElement

方法五:为SELECT添加大数量的选项的时候,使用innerHTML,而不是添加一个调用一次createElement。

在下面的例子中,使用了一个字符串。将需要添加的内容用HTML文档的格式负值给字符串,然后当作一个需要添加在HTML页中的文字一样添加到相应的SELECT中,就像方法二种我们讨论的那样。而不是添加一个<option>,调用一次相应的方法。在这其中,我们使用了Microsoft JScript的join方法,来进行最终的<option>节点的拼接。
点击进入演示界面

慢:

var opt;

divUpdate.innerHTML = "<SELECT ID='selUpdate'></SELECT>";

for (var i=0; i<1000; i++)

 {

  opt = document.createElement( "OPTION" );

  selUpdate.options.add( opt );

  opt.innerText = "Item " + i;

 }

快:

var str="<SELECT ID='selUpdate'>";

for (var i=0; i<1000; i++)

 {

  str += "<OPTION>Item " + i + "</OPTION>";

 }

str += "</SELECT>";

divUpdate.innerHTML = str;

更快:

var arr = new Array(1000);

for (var i=0; i<1000; i++)

 {

  arr[i] = "<OPTION>Item " + i + "</OPTION>";

 }

divUpdate.innerHTML = "<SELECT ID='selUpdate'>" + arr.join() + "</SELECT>";

使用DOM来改变您的表格:

使用DOM中的方法来为自己的表格添加更多的行与列,要比使用insertRowinsertCell两种方法合算的多。当建立非常大的表格的时候(比如说100行100列,或者更多),这就显得尤为有效。

方法六:使用DOM来建立大的表格。

下面的例子给出了两种不同的方法,来为一个表格添加更多的行与列。
点击进入演示界面

慢:

var row;

var cell;

for (var i=0; i<100; i++)

 {

  row = tblUpdate.insertRow();

  for (var j=0; j<10; j++)

   {

    cell = row.insertCell();

    cell.innerText = "Row " + i + ", Cell " + j;

   }

 }

快:

var row;

var cell;

var tbody = tblUpdate.childNodes[0];

tblUpdate.appendChild( tbody );

for (var i=0; i<100; i++)

 {

  row = document.createElement( "TR" );

  tbody.appendChild( row );

  for (var j=0; j<10; j++)

   {

    cell = document.createElement( "TD" );

    row.appendChild( cell );

    cell.innerText = "Row " + i + ", Cell " + j;

   }

 }

一劳永逸:

当你的网页多次用到同一段脚本代码的时候,不要在每个请求这段脚本的网页中添加代码。我推荐的做法是把这段脚本保存在一个文件中,让每个请求这段代码的网页直接去调用那个文件。这样如果该脚本已经被某个客户端执行了一次,那么它将被写在这个客户端的浏览器缓存中,下次调用的时候不必下载这部分内容,从而节省了时间。

方法七:将需要多次调用的脚本内容存放在一个文件中,另所有网页共享这一资源。

当然,这一方法也可以扩展到层叠样式表(CSS)的使用。通常同一站点的网页都具有相同的风格,从而也就涉及到非常多的样式的设定。将这些设置保存在一起,作为一个共享资源出现在您的站点中,这样可以提高网页的请求速度,同时不影响任何的效果。


不要制作动态效果过多的网页:


DHTML中的各种功能为开发人员提供了一个非常广阔的开发空间,它能够使我们的网页变得更加具有动感。这是一项伟大的创举,同时更重要的,它减少了网页中脚本代码的数量。但是同样他也带来了相应的问题,在执行DHTML中的各种效果的时候,每次都会调用HTML编译器对代码进行重新编译,甚至重新计算网页中各个元素的具体位置。这一部分在时间以及性能上的开销往往会令您的网页看起来不是那么协调。所以,尽量在一篇网页上不要用到更多的动态效果,这样会加快网页的访问速度。

方法八:一篇网页内不要有过多的动态效果。

这一部分就没有代码可以演示了 :)


学会使用数据绑定


数据绑定是一个非常强大的功能,适用的情况是,对于现有的一组数据,不必每次动态的调用,而是使用类似于XML data island的功能,加入到现有的HTML文档中。这样您不必在网页中提供一个类似于产看各种功能的函数,取而代之的是一个资料的整体的索引。可能大家不太明白这句话的具体含义。举个例子说,比如您有一个个人网站,希望把自己的生平事迹全都罗列出来,那可是一项巨大的工程!用普通的方法,每次浏览者希望看到您的受教育的情况,让我们看看这个过程:他在网页上找到您提供的相应的功能,点击,向服务器发出请求,通过验证,在数据库(如果是的话)找到需要的资料,下载,HTML编译器重新编译结果,计算网页显示的格式(也就是具体的位置),显示在您的眼前。哇!看一个简单的资料需要如此繁琐的过程,最要命的是还要去服务器请求结果!如果此时服务器很慢呢?所以我们的解决方案是数据绑定,将所有数据绑定到客户端,浏览者就可以不用通过请求服务器做到同样的事情,并且效率是原先的好几倍,更重要的是,您的网页上省去了那些讨厌的功能按钮,这样就能更加快速的在本地浏览。

方法九:使用数据绑定,为客户端提供更多更快的数据资源。

这一部分也没有代码可以演示 :)


不要在document中使用属性额外的属性
DHMTL中提供了一个功能,可以自己定义属性,这样我们就能用自己定义的属性来存放更多的有用的资料。例如,我们可以自己定义一个事件叫做mouseover,当真正的onmouseover引发的时候引发自己定义的函数(类似于HTC)。但是千万记住,不要在document对象中使用这样的技术。

方法十:最好在window对象中使用自定义属性。

点击进入演示界面

慢:

for (var i=0; i<1000; i++)

 {

  var tmp;

  window.document.myProperty = "Item "+i;

  tmp = window.document.myProperty;

 }

快:

for (var i=0; i<1000; i++)

 {

  var tmp;

  window.myProperty = "Item "+i;

  tmp = window.myProperty;

 }

关于Class与CSS:

如果您的网页提供了不同的阅览风格,这需要我们对同一个元素,定义很多不同的样式。最好的方法是,直接修改该元素的style,而不是改变这个元素的className

方法十一:改变元素样式,直接修改该元素style,不要改变它的className。

这部分也没有代码 :)


写在最后

上面讨论了一些小的技巧,如何使动态网页的访问变得更加快速,这在我们平时的工作中,是绝对用的到的。如果您是一个初学网页设计的人,那么这篇文章可能并不适合您。
如果大家有更多好的建议,好的方法,好的技巧,我希望与大家作进一步的交流。您可以点击左边的“评注”,把您想说的都留在那里,或者您也可以给我发信,我的个人邮箱是:onefi@frontfree.net

分享到:
评论

相关推荐

    用AI做思维导图,方法操作简单,使用的AI完全免费,通俗易懂,一学就会,提高工作效率!

    用AI做思维导图,方法操作简单,使用的AI完全免费,通俗易懂,一学就会,提高工作效率!

    Vue带你快速入门,要的就是效率!

    在这个"Vue带你快速入门,要的就是效率!"的教程中,我们将深入浅出地探讨Vue的基础知识,帮助你在短短4小时内快速掌握Vue.js的基本用法。 首先,我们要了解Vue的基本结构。Vue应用的核心是Vue实例,它是通过`new ...

    HB_MOULD 软件宗旨:提升模具设计效率! 振兴中华模具工业!

    HB_MOULD M6.2 (UG全3D塑胶模具设计软件)具体改进 : 1.改进面中心ucs命令,一次生成后可连续选择继续! 2.改进水口命令,点胶口命令当参数界面需取消操作时,按esc键即可退出, ... 3.改进中托司命令,改进手动中托司...

    绝了!Excel可以这样用:职场Excel效率提升秘笈【PDF】

    本书全面、系统地讲解了Excel在日常工作中的应用,结构独具匠心,以应知应会的知识点为主线,以实际案例和应用技巧为主题,有助于职场人士解决实际工作中的问题,提高工作效率,培养Excel应用能力。本书附带1张光盘...

    让Excel飞!职场Office效率提升秘籍

    职场Office效率提升秘籍》是一本关于如何有效利用Excel和Access提高职场效率的书。书中凝聚了作者多年来关于如何利用Excel和Access提升个人生产力的独特思考。  《让Excel飞!职场Office效率提升秘籍》共分两部分,...

    OIIO效率专家(简体中文版).20201103.zip

    《OIIO效率专家:提升办公效率的秘密武器》 在快节奏的现代办公环境中,时间就是效率,效率就是生产力。OIIO效率专家,以其强大的功能和简体中文版的友好界面,成为了众多职场人士提升办公效率的秘密武器。这款工具...

    EMS超效率DEA

    "EMS超效率DEA"是一款专注于实现超效率数据包络分析(DEA)的软件工具。DEA,全称为Data Envelopment Analysis,是一种用于评价多输入、多输出系统效率的非参数方法,常用于评估和比较不同决策单元(如企业、学校、...

    实际波形讲解半桥LLC效率低下原因及解决

    【LLC谐振变换器效率低下原因分析及解决方法】 LLC谐振变换器因其开关损耗小、适用于高频高功率应用而备受青睐。然而,在实际设计中,许多工程师可能会遇到功率输出不足的问题。本文以半桥谐振LLC变换器为例,深入...

    MaxDEABasic6_MAXDEA软件_sbm_超效率sbm_

    MaxDEABasic6是一款专为效率分析设计的专业软件,它主要应用于数据包络分析(Data Envelopment Analysis,简称DEA)领域。DEA是一种非参数方法,用于评估多个决策单元(DMUs)在多投入、多产出条件下的相对效率。这...

    火电机组锅炉效率和汽缸效率计算软件

    结合【GB10184-88】电站锅炉性能试验规程,【DL-T904-2004】火力发电厂技术经济指标计算方法及【大唐Q/CDT 105 0001—2009】耗差分析技术标准的各自优势的锅炉效率反平衡计算。 汽轮机缸效率计算。 工具是安装包,...

    一份用MATLAB编制电机效率map图的程序

    利用 MATLAB 绘制电机效率 MAP 图 MATLAB 是一种广泛应用于科学计算、数据分析和可视化的编程语言。 在电机效率 MAP 图绘制中,MATLAB 发挥着重要作用。 本文将详细介绍如何使用 MATLAB 绘制电机效率 MAP 图,并对...

    水力、容积、机械效率1.0

    在IT行业中,尤其是在自动化控制、能源管理或者水利工程等领域,水力、容积和机械效率是至关重要的概念。这些参数对于理解和优化系统性能有着基础性的作用。让我们深入探讨这些概念及其计算方法。 首先,水力效率...

    areamap.zip_areamap_三维云图_电机 云图_电机效率三维_电机效率云图

    本主题聚焦于“电机效率云图”的绘制,这是一个利用三维插值技术来展示电机效率分布的有效方法。我们将深入探讨这个过程以及涉及到的相关知识点。 首先,“areamap”在数学和工程中通常指区域映射,它是一种将二维...

    Oracle提高数据库效率

    此文档是Oracle提高数据库效率的总结,能够帮助你在使用Oracle编程时带来的效率问题!

    Cruise_efficient_matlab_m.zip_效率map图_电机 MAP图_电机 map_电机map图_电机效率图

    用于绘制电机效率MAP图 包含m文件及数据文件

    筛分效率评定方法的探讨

    筛分效率评定方法是工业领域内一项重要的技术评估指标。在矿物加工、化工、食品等许多行业,物料的筛分是必不可少的工序,因此,如何准确、高效地评估筛分效率,对于提高生产效率、降低能耗、保证产品质量都具有重要...

    【自用、稀缺、权威方法!】2006-2022上市公司创新效率数据合集(数据包络分析DEA法)

    效率相关研究是近年来研究的热点方向之一,创新效率可以用于金融学和企业经济等领域的 研究,并在各类顶级刊物中频繁出现。附件内为附件内为由本人及所在课题组独家整理、权 威测度、多重校验的2006-2022上市公司...

Global site tag (gtag.js) - Google Analytics