对于网站来说很多页面之间都有着大量的共享模块,如页头,页脚和用户栏等。对于具备后端视图引擎的框架来说这些共享都比较容易抽取,如asp.net mvc来说就有统一布局的masterpage,@ction等功能可以共享视图模板功能。但对于html就没这么幸运了,在html文件里并不具备这些功能,所以当你用纯html页面来写应用网站的时候估计不得不面对这些重复的工作,虽然可以通过嵌套iframe的方式来实现,不过这种实现方式并不理想和友好。
实际场分析
最近基于自有框架实现一个网站,由于框架并不具备后端视图引擎,这种麻烦事就碰到了…我们先来看一下实际情况。
以上两个html页面除了核心部分是独有的,其他数据块都是相同。如果没有后端视图引擎你想到怎样做呢….刚开始每个地方修改都要同步到其他页面。后来发现这样的做法一定会把自己迫死的。经过一段时间的思考想到了一个解决的办法。
公共模板定义
思考后发现可以把公共模板抽取到一个html文件中(文件名就暂定publicmodule.html),如下:
<templates> <template id="header"> <div class="navbar-header"> <button class="navbar-toggle collapd" type="button" data-toggle="collap" data-target=".navbar-collap"> <span class="sr-only一般将来时标志词">toggle navigation</span> <sshall的用法pan class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/">.net library</a> </div> <div class="navbar-collap collap" role="navigation"> <div style="margin-top:15px;margin-left:120px; position:absolute;"><span style="color:white;padding-top:20px;">xxxxx</span></div> <ul class="nav navbar-nav"></ul> <ul class="nav navbar-nav navbar-right"> <li><a href="/blog.html">博客</a></li> <li><a href="/d/file/titlepic/FastHttpApi" target="_blank">github.com</a></li> <li><a href="/admin/index.html">网站管理</a></li> </ul> </div> </template> <template id="doc_tags_navbar"> <div class="container-fluid" style="padding:0px;"> <ul class="nav navbar-nav btn-group-sm" id="tagbar"> <li><a style="font-weight:bold; padding-bottom:6px;padding-top:6px;" href="/index.html">首页</a></li> <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> </ul> 天蟹座 </div><!-- /.container-fluid --> <script> var tagbarcontrol; tagbarcontrol = new vue({ el: '#tagbar', data: { data: [] } }); async function listdoctags() { var result = await $listdoctags(); tagbarcontrol.data = result.data; } listdoctags(); </script> </template><templates>
通过template标签来定义一个模板块,然后针对每个块定义一个唯一id。可能有些同学会问template并不是有效的html标签,那怎处理里呢?对的template浏览器是不会处理,但jquery是可以,说到这里相信有此同学理解原理了。
在html中应用模板
当模块定义后,那在html中怎么引用呢?其实html并不支持这样的功能,不过我们可以给html定义一些自定义属性给jquery解释,在这里定义了一个slot属性用于指定模板id
&大学生转正申请lt;div class="navbar navbar-inver navbar-fixed-top"> <div class="container" slot="header"> </div> </div> <nav class="navbar navbar-default" style="padding:0px;margin:0px;min-height:0px;" slot="doc_tags_navbar"> </nav>
模板定义了,页面的html也引用了,接下来就要整合他们。到了这里相信熟悉jquery的朋友一定想到要怎么做了:)
使用jquery整合加载
对于jquery来说可以把公共模块页加载后转成dom,然后替换页面上定义了slot的元素
function moduleload(url) { $.get(url, function (result) { var html = $(result); var __templates = html; $("[slot]").each(function () { var id = $(this).attr('slot'); var body = $(__templates).find('#' + id).html(); $(this).html(body); }); });}$(document).ready(function () { moduleload("/publicmodule.html");});
代码简单有效,把整会脚本存到一个文件中,然后添加到页中就自动加载了.
加载速度问题
原本一次就能加载的html页面,现在还需要ajax加载不会导致加载慢了吗?其实可以把公共模块的html页做一个本地缓存策略,这样所有页面加载模块的时候都能直接从本地拿;由于公共部分抽取出来,从而让相关页面的休积变得更小,加载速度更快。
基于纯html/js前端开发优势
对于习惯使用服务端视图引擎的朋友来说,完全使用html/js的前端开发模式可以有点困难。但完全基于html/js的前端开发有着明显的优势,视图处理不需要服务解释大大降低了服务器的损耗,html可以更好地做本地化缓存,还有现在大量的html/js框架让你在编写的时候更轻松简单。
总结
以上所述是爱情里的眼泪简谱www.887551.com给大家介绍的传统html页面实现模块化加载的方法,希望对大家有所帮助
本文发布于:2023-04-03 08:48:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/6b7b271105e1e3d27a094e73d71cbc51.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:传统HTML页面实现模块化加载的方法.doc
本文 PDF 下载地址:传统HTML页面实现模块化加载的方法.pdf
留言与评论(共有 0 条评论) |