<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语法分析器是需要被调用的,此时必然会带来一部分多余的开销。您可以使用insertAdjacentHTML和pasteHTML两种方法,以及innerHTML和outerHTML两种属性来在网页上添加新的内容文字。
方法一:改变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编译器的,所以在这期间,必然会有效率上的损失。所以,在添加新的节点的时候,我们联合调用createElement和insertAdjacentElement方法,而不是仅仅调用一次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中的方法来为自己的表格添加更多的行与列,要比使用insertRow和insertCell两种方法合算的多。当建立非常大的表格的时候(比如说100行100列,或者更多),这就显得尤为有效。
下面的例子给出了两种不同的方法,来为一个表格添加更多的行与列。 点击进入演示界面
慢:
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对象中使用这样的技术。
点击进入演示界面
慢:
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
|
相关推荐
【编程技巧】掌握Python与ApacheMesos的完美结合,提升你的开发效率!.docx
用AI做思维导图,方法操作简单,使用的AI完全免费,通俗易懂,一学就会,提高工作效率!
在这个"Vue带你快速入门,要的就是效率!"的教程中,我们将深入浅出地探讨Vue的基础知识,帮助你在短短4小时内快速掌握Vue.js的基本用法。 首先,我们要了解Vue的基本结构。Vue应用的核心是Vue实例,它是通过`new ...
电机效率Map是电机性能分析中的一个重要概念,它用于描述电机在不同工况下运行的效率分布情况。在本文中,我们将深入探讨电机效率Map的绘制方法、意义以及如何利用工具进行计算。 电机效率是指电机输出的机械功率与...
效率 Max !IDEA 会酷 ?只因我装了这 12 个插件
SBM(Slacks-Based Measure)经济效率模型是一种用于评估组织或机构效率的非参数方法,特别是在经济学、管理学和环境科学等领域广泛应用。该模型通过考虑生产过程中的松弛变量(slacks),即未能达到最优状态的资源...
利用 MATLAB 绘制电机效率 MAP 图 MATLAB 是一种广泛应用于科学计算、数据分析和可视化的编程语言。 在电机效率 MAP 图绘制中,MATLAB 发挥着重要作用。 本文将详细介绍如何使用 MATLAB 绘制电机效率 MAP 图,并对...
此文档是Oracle提高数据库效率的总结,能够帮助你在使用Oracle编程时带来的效率问题!
在永磁同步电机的设计和优化过程中,电机效率Map图是一种重要的工具,它能够直观地表示电机在不同工况下的效率表现。传统的电机测试方法依赖于实际样机的测试,这不仅耗时耗力,而且成本高昂。随着计算机技术的发展...
用于绘制电机效率MAP图 包含m文件及数据文件
水泵效率的高低直接关系到能源消耗和运行成本,因此,准确计算和理解水泵效率对于水泵的选型和使用至关重要。 水泵效率通常定义为水泵输出的机械能与输入的电能之比。它是通过比较水泵实际输出功率与输入功率来计算...
在IT领域,特别是数据分析和运筹学中,DEA(Data Envelopment Analysis,数据包络分析)是一种评估决策单元(DMU)效率的非参数方法。DEA模型被广泛应用于各种行业的绩效评估,如金融、教育、医疗和生产管理等。本...
本文将详细探讨除尘效率的计算方法,包括全效率、穿透率、分级效率以及它们之间的关系,旨在为工程设计提供理论依据和实践指导。 全效率是评价除尘器捕集全部粉尘能力的基础指标,通常有两种计算方法。质量算法基于...
polarizationconversionefficiency.lsfFDTD计算偏振转换效率的脚本,入射LCP经单位晶胞后既有LCP分量又有RCP分量,计算偏振转换效率.zip
基于ASME的国标的电站燃煤锅炉效率在线计算软件,基于GB10184-88标准和GB10184-2015标准的锅炉效率计算方法。
技术进步是近年来全球面临气候变化问题时减少碳排放,提高碳排放效率的关键因素之一。在中国,随着经济的快速增长,资源生态环境的压力也在不断增加,因此提高碳排放效率成为了一个紧迫的问题。在这样的背景下,中国...
基于DEA模型的中国林业投入产出效率评价是林业生产和管理的重要研究领域,本研究通过对1993-2010年间中国林业投入产出效率的测算和分析,旨在评价中国林业投入产出的效率水平和变化趋势,并探讨影响林业投入产出效率...
### 用归一分析法分析床位工作效率 #### 概述 在医疗资源管理中,床位利用率是衡量医院工作效率的关键指标之一。归一分析法是一种基于数学模型的方法,它能够有效地评估床位的工作效率,并帮助管理者做出更为精准...