Javascript UI渲染技术
Javascript UI rendering techniques
我正在构建一个AJAX"web应用程序",一旦加载了UI,对服务器的调用仅用于"数据交换"。因此,许多UI操作将使用Javascript完成。假设Javascript使用AJAX从服务器检索一些由多个字段组成的数据。要把它放在屏幕上,我可以想到多种方法-
- 调用createElement()和appendChild()等方法来构建一个显示检索到的数据的接口
- 为容器元素填充.inerHTML,然后为每个数据字段在新添加的HTML中查找一个容器并填充它。进入.inerHTML的数据可以存储在JS变量中,也可以包含在隐藏节点中,或者使用单独的AJAX调用获取
- 将接口存储在隐藏节点中。克隆它(使用cloneNode())并将其放入实际容器中(使用appendChild()),然后用方法2中的字段填充它
可能还有更多的方法。
您能否从跨浏览器支持、性能和编码复杂性的角度分享这些方法的优缺点和可能的解决方案?
一些相关的问题:通过Javascript进行客户端UI渲染是个好主意吗?
谢谢。
好吧,让我们开始吧:
使用工具包
首先,您需要花费时间学习JS工具包。虽然其他人认为原生JS很好(事实确实如此),但你不想浪费时间构建无法跨浏览器运行的应用程序,也不想花太多时间测试它。社区中的人已经为你投入了时间。向开放的社区表达一些爱,并使用他们的产品。我个人使用jQuery,但也有其他类似Dojo和YUI的工具。
但仍然尽可能使用原生JS。它仍然更快。
构造代码
工具包之后,您需要一些结构。BackboneJS会处理好的。这是为了构建你的代码,使你的代码可以重用。。不会在你的屏幕上变成意大利面条。对于那些需要运行其他脚本的脚本,RequireJS等其他工具也很有用。
模板:从字符串到元素
然后,有了它,您现在有了一个工具包,但仍需要构建接口。如果您使用Mustache或Handlebars这样的模板引擎,效果会更好。这些从字符串(是的,HTML的纯字符串)为UI呈现模板。只需从服务器发送模板数据,将其存储在应用程序中(在变量或浏览器本地存储中),并在必要时重用它。无需克隆隐藏节点!
不要碰那个DOM
至于接近DOM,只有在必要时才应该触摸DOM。DOM很慢,操纵它很慢!这意味着您应该避免不必要的动画,避免过多的元素附加和移除,以及更改样式。查看这篇关于避免过多回流和重新喷漆的文章。面对现实,用户不会注意到你方框的圆角或渐变背景,甚至不在乎你是做了幻灯片动画还是淡出。他们想要的是完成任务,而不是喜欢烟火表演。
此外,删除任何不在屏幕上的内容。你可能会在屏幕上看到20%的内容,在屏幕外看到80%的内容——这是浪费内存。
缓存:获取一次,存储,以后无限使用
现在,你的应用程序越来越重,你想减少一些HTTP请求。您可以通过缓存来做到这一点。我通常主要在模板上使用缓存,这样每个新的UI都不需要再次从服务器加载。你可以通过将东西存储在一个对象中来实现这一点。您可以更进一步,在可用时使用浏览器的localStorage。
缓存并不完全适用于网络。假设你有一些复杂的计算需要稍后使用,或者有一些未完成表单中的文本,也可以使用缓存。
避免HTTP请求(或者至少减轻它们)
当你使用AJAX来增强你的应用程序时,你不可避免地会被诱惑在任何地方使用AJAX——不要滥用它。我经常看到有人(每隔半秒或更短的时间)对服务器进行激烈的轮询。这不仅会使服务器(请求过多)紧张,还会使浏览器(浪费处理周期)和网络(带宽)紧张。这些天有几种做法可以避免添加HTTP请求:
-
图像精灵-将许多图像放在一个图像中,并使用背景位置更改图像的艺术。肯定胜过100个单独的HTTP请求
-
将JSON用于文本数据-AJAX旨在使用XML。。然后出现了JSON,这是一种无脂肪、独立于平台的结构化数据格式。
-
不返回HTML格式的数据-不包括HTML字符串的模板,您永远不应该通过连线返回HTML格式数据。让JS在客户端做JSON+模板。
我正在构建一个类似的应用程序(轻量级CMS)
在我看来,您所采取的方法将取决于从服务器发送>在客户端操作>并返回到服务器和数据库的数据的复杂性。
我正在做的cms是非常基本的,不需要在客户端进行大量的操作。TinyMCE已经走到了尽头。
最初,我通过从php中echo
和<input>
来构建客户端管理区域,然后通过解析DOM来收集数据,将其转换为JSON和AJAX并返回到服务器(我发现这段代码非常有用)当然,这需要用户在编辑或添加新数据后点击"保存"。
后来我决定,我需要一个比这更快速、更简单的东西,所以我现在正在为Jedit重新实现一切,只要客户端在特定字段上点击"OK",就会AJAX数据。不需要"主保存"。
总之,这确实是一个相当未知的领域。我的意思是,在我看来,业内人士不喜欢模糊后端和前端之间的界限,并找到"一个解决方案"来完成整个DB>SERVER>CLIENT>SERVER>DB操作。
我很想看看你是如何解决问题的。
只有我的2美分。
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- jQuery UI自动完成突然停止工作
- 如何使用skip参数使用angular ui引导进行服务器端分页
- AngularJS UI路由器不能像ng路由器那样工作
- 我可以更改剑道UI网格吗's的外键值
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- Rails/JSON:如何将JSON用于jquery UI自动完成表单
- 停止jQuery UI滑块移动超过给定值
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- Jquery UI自动完成无法工作
- 语义ui如何使用javascript启用或禁用下拉列表
- jquery ui滑块上的滑块值
- jQuery UI可排序-多连接列表拖动
- 如何在Angular UI网格中选择下一行
- 对具有ui typeahead的对象中的值执行orderBy
- AngularJS ui路由器html5模式中断路由
- 从技术上讲,是否可以在不拥有页面UI的情况下删除页面UI的某些部分
- Javascript UI渲染技术
- Java EE应用程序的UI技术
- 我应该使用什么技术来实现这个web UI特性?(HTML框架或表格或其他)