`
mars李
  • 浏览: 50177 次
  • 性别: Icon_minigender_1
  • 来自: 柳州
社区版块
存档分类
最新评论

实战DHTML性能优化,改善自定义下拉框控件

阅读更多
实战DHTML性能优化,改善自定义下拉框控件


先介绍一下本文演示用的代码,在我的项目中要实现一个自定义样式的下拉框,使用自定义的下拉箭头和自定义颜色的边框来取代系统默认的select。要实现这个功能就需要通过table模拟实现。那么我使用一个js方法来实现这个模拟过程,并封装为initSelect(id, width, height)方法。

并提供setSelect(id, index)进行某选项的选中,以及其他一些方法,全部功能至少同时兼容IE和FireFox。

因为当初写的比较随意,代码全部完成后,发现性能相当低下。大约出生日期这样的3个下拉框需要几百毫米的时间。

整优化过程我分3次进行

第一步

优化的技巧之一就是优先优化循环体,我把循环体内的不良做法优化,例如

for(var i=0;i<sel.options.length;i++)

--》

for(var i=0,j=a.length;i<j;i++)


sel.options[i].value;

--》

a[i].value;

本步产生代码initSelect2,祥见包内的s.js,下同

第二步

通过上面一个很小的改动,可以节省一些时间了,但是不会有什么大的改观,离我们优化要达到的目标相去甚远。那么现在静下来想一下,应该修改一下逻辑了

由于我们initSelect采用的方式是通过createElement创建TR,然后添加到table的rows集合中,由于创建和解析html都需要时间,所以效率较差,下面我们改良为数组方式

var arr = new Array(a.length);
for (var i=0,j=a.length;i<j; i++)
{
 arr[i] = "<tr><td title='" + a[i].text + "' value='" + a[i].value + "'>" + a[i].text + "</td></tr>";
}
oCell.innerHTML = "<div id=\"O" + id + "\" class=\"select\" onselectstart=\"return false\" onmouseover=\"HoverOptions(event);\" onmouseout=\"OutOptions(event);\" onclick=\"ClickOptions(event, 'O" + id + "');\">\
      <table cellsapcing=\"0\" cellspadding=\"3\" border=\"0\" width=100%>\
      <tbody>" + arr.join() + "</tbody>\
      </table>\
     </div>";

这样DOM只需解析一次HTML,取得了很好的效果,速度提高了3倍,从300ms降到几十毫秒。

本步产生代码initSelect3

第三步

那么还可以进一步优化吗,答案是肯定的。我们前两步的重点是循环体,现在该着眼大局了,由于整个方法体内仍然多次使用了innerHTML,这是一个非常慢的操作,微软非常推荐使用innerText来尽可能代替innerHTML,但是显然不适合此处。而且必须要指出的是innerText不属于W3C标准,因而不被fireFox支持。

我前面的一些随便中的DHTML技巧里已经指出了insertAdjacentElement会比insertAdjacentHTML效果好,但是这次我们决定抛弃insertAdjacentElement而使用insertAdjacentHTML,因为这样以来我们可以把HTML解析降低为一次,所以我们把多个节点使用一个insertAdjacentHTML完成,而不是insertAdjacentElement配合多次innerHTML赋值。采取这些调整以后,我们的代码再次得到提速,虽然效果不很明显,但是仍有超过10%的改善。

本步产生代码initSelect4

参考时间:
initSelect 313
initSelect2 297
initSelect3 140
initSelect4 94

后记

其实这个方法在项目开发初期就有了,当时使用的是
for(var i=0;i<sel.options.length;i++)
{
td.innerHTML += "<tr><td>" + sel.options[i].text + "</td></tr>";
}
结果当时一个50项的select在我的3g cpu上竟然需要500ms以上的加载时间,这次调优,我重写了该方法,并分步进行了优化,希望能给DHTML开发者们带来一些启示。


如果诸位需要使用这个自定义下拉框,只需select.js和s.css,而优化演示请看demo1中的文件(代码不完整,只做演示)

全文完

分享到:
评论

相关推荐

    html多选下拉框 ,CheckBox的Select组件 可多选的下拉框

    在HTML中,创建一个可多选的下拉框通常涉及到`&lt;select&gt;`元素与`&lt;option&gt;`元素的组合,但为了实现多选功能,我们需要使用`&lt;input type="checkbox"&gt;`和自定义的JavaScript或者利用现代浏览器支持的Web组件技术。...

    微软Dhtml网页开发控件帮助文档(翻译)

    微软Dhtml网页开发控件帮助文档(翻译)微软Dhtml网页开发控件帮助文档(翻译)

    DHTML 完整包

    开发者可以利用这些组件快速构建功能丰富的动态页面,同时,该库优化了性能,使得在不同浏览器上的表现更加一致。 3. **manifest.txt**:这是一个清单文件,通常用于Web应用程序或浏览器扩展,列出应用程序所需的...

    个人收集4种漂亮的javascript+dhtml动态树控件

    JavaScript 和 DHTML 动态树控件在网页开发中经常被用来展示层级结构的数据,例如网站导航、文件系统或者组织架构。这些控件通过交互式的界面,为用户提供了一种直观的方式来浏览和操作数据。以下是对这四种个人收集...

    dhtmltree控件

    随着技术的发展,该控件可能有更现代的版本,提供更多的特性和优化。开发者应关注官方更新,适时考虑升级以获得更好的性能和兼容性。 总之,`dhtmltree`作为一款强大的JavaScript树型控件,不仅简化了在JSP中构建...

    一个基于dhtml+js实现的Web颜色拾取控件colorpicker

    "一个基于dhtml+js实现的Web颜色拾取控件colorpicker"是一个纯JavaScript编写的库,它允许开发者在网页上集成一个功能丰富的颜色选择器,用户可以通过这个控件轻松选取并设置颜色。 dhtml(Dynamic HTML)是一种...

    麻雀虽小五脏俱全 Dojo自定义控件应用

    【Dojo自定义控件应用】 Dojo是一个强大的JavaScript库,专为构建复杂的DHTML应用程序设计。它通过解决DHTML的遗留问题,如浏览器兼容性、动态内容管理和事件处理,为开发者提供了一套完整的工具集。尽管Dojo的文档...

    DHTML 手册 DHTML 手册

    5. **拖放功能**:允许用户在页面上拖动元素,实现自定义布局。 6. **实时内容更新**:通过Ajax(Asynchronous JavaScript and XML)技术,可以异步从服务器获取并更新内容,提高网页的响应速度。 DHTML 手册通常会...

    dhtmlxgrid自定义CELL编辑事件

    在本篇文章中,我们将详细介绍如何自定义dhtmlxgrid的CELL编辑事件,实现自定义的编辑控件。 一、自定义CELL编辑事件 在dhtmlxgrid中,可以通过继承eXcell类来实现自定义的CELL编辑事件。在上面的示例代码中,我们...

    网站性能优化28条守则

    【网站性能优化28条守则】是一篇关于提升ASP应用程序和VBScript性能的文章,它提供了许多实用的建议,旨在帮助开发者改善ASP页面的运行效率。这篇文章基于在Microsoft官方网站和其他站点的实际测试,证实了这些优化...

    DHTML手册 DHTML手册

    JavaScript通常用于操作DOM,添加、删除或修改页面元素,从而实现DHTML的效果。 CSS在DHTML中扮演着重要角色,它负责定义元素的外观和布局。通过选择器和规则,我们可以改变HTML元素的颜色、大小、位置等属性。CSS3...

    推荐发几个常用控件(新加DHTML控件)

    在本文中,我们将探讨几个常用的DHTML控件,这些控件在开发Web应用程序时非常有用,特别是对于那些希望增强用户界面交互性的开发者。DHTML(Dynamic HTML)是一种技术,允许网页内容动态更新,无需重新加载整个页面...

    DHTML用户界面,使用方便

    “libCompiler”可能是一个编译器库,用于处理JavaScript代码,可能包括代码压缩、混淆和优化,以提高页面加载速度和代码安全性。 “docsExplorer”可能是文档浏览器或一个工具,帮助开发者查阅和理解dhtmlxSuite的...

    DHTML的学习手册

    DHTML通过JavaScript可以扩展这些控件的功能,例如: 1. **事件处理**:JavaScript可以监听并响应控件的点击、改变等事件,从而实现动态效果。 2. **属性操作**:可以修改控件的属性,如改变按钮的文字或颜色。 3. ...

    TreeGrid DHTML的表格控件

    TreeGrid是一个DHTML的表格控件,它完全使用JavaScript语言编写,用以实现HTML页面上的table, grid, tree view 或者 grid with tree里的数据地展示和编辑。EJS TreeGrid还提供了强大的甘特图功能,能够满足您把项目...

    DHTML手册 DHTML

    - 滚动条特效:自定义滚动条样式,实现平滑滚动。 学习和掌握DHTML,对于现代网页开发至关重要,它能帮助开发者创造出更具吸引力和用户体验的动态网站。随着Web技术的不断发展,DHTML的概念逐渐被更现代的前端框架...

    Dhtml手册(Dhtml手册.chm)

    本Dhtml手册.chm文件是一个关于DHTML的综合参考资料,对于想要深入了解和学习DHTML的开发者来说,是一份宝贵的资源。 1. **HTML基础**:DHTML建立在HTML的基础上,HTML是超文本标记语言,用于创建网页结构。DHTML...

    DHTML 默认行为中文手册

    **DHTML默认行为中文手册** DHTML(Dynamic HTML)是一种技术,它允许网页在不刷新整个页面的情况下更新部分内容,实现动态交互效果。这个“DHTML默认行为中文手册”是针对开发者的重要参考资料,旨在帮助他们理解...

Global site tag (gtag.js) - Google Analytics