zoukankan      html  css  js  c++  java
  • 模板使用的一个坑

    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);
    

     

    原文连接:http://javascript.ruanyifeng.com/bom/engine.html#toc5

    学而时习之不亦悦乎。
  • 相关阅读:
    Penetration Test
    Penetration Test
    Penetration Test
    Penetration Test
    controller配置方式总结(继上)
    架构师的自我修养
    SpringMVC快速入门
    第十六章:字节流与字符流
    第十五章:文件操作
    第十四章:类库使用案例分析
  • 原文地址:https://www.cnblogs.com/xianZJ/p/4836974.html
Copyright © 2011-2022 走看看