经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML » 查看文章
传统HTML页面实现模块化加载的方法
来源:jb51  时间:2018/10/17 8:47:00  对本文有异议

对于网站来说很多页面之间都有着大量的共享模块,如页头,页脚和用户栏等。对于具备后端视图引擎的框架来说这些共享都比较容易抽取,如asp.net mvc来说就有统一布局的MasterPage,@Section等功能可以共享视图模板功能。但对于HTML就没这么幸运了,在html文件里并不具备这些功能,所以当你用纯HTML页面来写应用网站的时候估计不得不面对这些重复的工作,虽然可以通过嵌套IFrame的方式来实现,不过这种实现方式并不理想和友好。

实际场分析

最近基于自有框架实现一个网站,由于框架并不具备后端视图引擎,这种麻烦事就碰到了...我们先来看一下实际情况。

以上两个HTML页面除了核心部分是独有的,其他数据块都是相同。如果没有后端视图引擎你想到怎样做呢....刚开始每个地方修改都要同步到其他页面。后来发现这样的做法一定会把自己迫死的。经过一段时间的思考想到了一个解决的办法。

公共模板定义

思考后发现可以把公共模板抽取到一个HTML文件中(文件名就暂定PublicModule.html),如下:

  1. <templates>
  2. <template id="header">
  3. <div class="navbar-header">
  4. <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".navbar-collapse">
  5. <span class="sr-only">Toggle navigation</span>
  6. <span class="icon-bar"></span>
  7. <span class="icon-bar"></span>
  8. <span class="icon-bar"></span>
  9. </button>
  10. <a class="navbar-brand" href="/">.Net Library</a>
  11. </div>
  12. <div class="navbar-collapse collapse" role="navigation">
  13. <div style="margin-top:15px;margin-left:120px; position:absolute;"><span style="color:white;padding-top:20px;">XXXXX</span></div>
  14. <ul class="nav navbar-nav"></ul>
  15. <ul class="nav navbar-nav navbar-right">
  16. <li><a href="/Blog.html">博客</a></li>
  17. <li><a href="https://github.com/IKende/FastHttpApi" target="_blank">github.com</a></li>
  18. <li><a href="/admin/index.html">网站管理</a></li>
  19. </ul>
  20. </div>
  21. </template>
  22. <template id="doc_tags_navbar">
  23. <div class="container-fluid" style="padding:0px;">
  24. <ul class="nav navbar-nav btn-group-sm" id="tagbar">
  25. <li><a style="font-weight:bold; padding-bottom:6px;padding-top:6px;" href="/index.html">首页</a></li>
  26. <li v-for="item in Data"><a v-bind:title="item.Remark" style="font-weight:bold; padding-bottom:6px;padding-top:6px;" v-bind:href="['/index.html?tag='+item.ID]">{{item.Title}}</a></li>
  27. </ul>
  28. </div><!-- /.container-fluid -->
  29. <script>
  30. var tagbarControl;
  31. tagbarControl = new Vue({ el: '#tagbar', data: { Data: [] } });
  32. async function ListDocTags() {
  33. var result = await $ListDocTags();
  34. tagbarControl.Data = result.Data;
  35. }
  36. ListDocTags();
  37. </script>
  38. </template>
  39. <templates>

 

通过template标签来定义一个模板块,然后针对每个块定义一个唯一ID。可能有些同学会问template并不是有效的HTML标签,那怎处理里呢?对的template浏览器是不会处理,但JQuery是可以,说到这里相信有此同学理解原理了。

在HTML中应用模板

当模块定义后,那在HTML中怎么引用呢?其实HTML并不支持这样的功能,不过我们可以给HTML定义一些自定义属性给JQuery解释,在这里定义了一个slot属性用于指定模板ID

  1. <div class="navbar navbar-inverse navbar-fixed-top">
  2. <div class="container" slot="header">
  3.  
  4. </div>
  5. </div>
  6. <nav class="navbar navbar-default" style="padding:0px;margin:0px;min-height:0px;" slot="doc_tags_navbar">
  7. </nav>

模板定义了,页面的HTML也引用了,接下来就要整合他们。到了这里相信熟悉JQuery的朋友一定想到要怎么做了:)

使用JQuery整合加载

对于JQuery来说可以把公共模块页加载后转成DOM,然后替换页面上定义了slot的元素

  1. function moduleLoad(url) {
  2. $.get(url, function (result) {
  3. var html = $(result);
  4. var __templates = html;
  5. $("[slot]").each(function () {
  6. var id = $(this).attr('slot');
  7. var body = $(__templates).find('#' + id).html();
  8. $(this).html(body);
  9. });
  10. });
  11. }
  12. $(document).ready(function () {
  13. moduleLoad("/PublicModule.html");
  14. });

代码简单有效,把整会脚本存到一个文件中,然后添加到页中就自动加载了.

加载速度问题

原本一次就能加载的HTML页面,现在还需要Ajax加载不会导致加载慢了吗?其实可以把公共模块的HTML页做一个本地缓存策略,这样所有页面加载模块的时候都能直接从本地拿;由于公共部分抽取出来,从而让相关页面的休积变得更小,加载速度更快。

基于纯HTML/JS前端开发优势

对于习惯使用服务端视图引擎的朋友来说,完全使用HTML/JS的前端开发模式可以有点困难。但完全基于HTML/JS的前端开发有着明显的优势,视图处理不需要服务解释大大降低了服务器的损耗,HTML可以更好地做本地化缓存,还有现在大量的HTML/JS框架让你在编写的时候更轻松简单。
 

总结

以上所述是小编给大家介绍的传统HTML页面实现模块化加载的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号