html模板相信很多人都用过,类似angular中的指令,通过模板对于html中很多相似的片段完全可以借助for循环或者ng-repeat指令来生成,大大提高效率。
最近在使用模板时候碰到一个坑,分享出来,希望对后来者有所帮助。
重构之前的代码:
<script type="text/javascript" src="../js/spaceBlogs.js" async></script>
<div id="spaceBlogsId" class="box" include="./tpl/spaceBlogsTpl.html"></div>
var drawTemplate = function(DomId){
var Dom = $("div[id="+DomId+"]");
if(!Dom){
alert("Dom不存在");
}
else{
$.ajax({
url : $(Dom).attr("include"),
success : function(res){
if (!$(Dom).attr("data")) {
var text = _.template(res);
}
else {
var text = _.template(res)($_scope[$(Dom).attr("data")]);
}
$(Dom).html(text);
},
error : function(res){
console.log(DomId + "模板绘制失败");
}
})
}
};
drawTemplate("spaceBlogsId")
但是这样写会导致一个问题,很多时候其实模板还没有渲染,对模板的dom添加事件的一些js已经运行了,导致事件没有添加上去。废了好大事都没有优化好,最后读了阮大神的一片博文才豁然开朗,于是有了下面的重写:
<div id="spaceBlogsId" class="box" include="./tpl/spaceBlogsTpl.html"></div>
var newFun = function(){
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= '../libs/rl_exp.js';
head.appendChild(script);
head= document.getElementsByTagName('head')[0];
script= document.createElement('script');
script.type= 'text/javascript';
script.src= '../js/uploadFile.js';
head.appendChild(script);
setTimeout(function(){
changeTagFun($("#blogTags").find("a")[2]);
},100);
};
//绘制模板方法
var drawTemplate = function(DomId,successCallBack){
var Dom = $("div[id="+DomId+"]");
if(!Dom){
alert("Dom不存在");
}
else{
$.ajax({
url : $(Dom).attr("include"),
success : function(res){
if (!$(Dom).attr("data")) {
var text = _.template(res);
}
else {
var text = _.template(res)($_scope[$(Dom).attr("data")]);
}
$(Dom).html(text);
if(successCallBack){
successCallBack();
}
},
error : function(res){
console.log(DomId + "模板绘制失败");
}
})
}
};
drawTemplate("spaceBlogsId",newFun);