[自制模板引擎]添加指令

模板引擎最大的一个特点就是其指令系统,通过执行一些简单的表达式,可以让这个模板引擎拥有计算功能,但是拥有指令,能让模板引擎拥有更强大的功能,下面来试着实现一些简单的指令,如for,if等等

扩展前面的一段遍历节点的代码,我需要在遍历节点的时候把这些内置的指令做特殊的处理,假设指令是向这样存在的 <div cc-for="arr"></div> :

    function eachNode(ele,obj) {
        //看看自身属性是否有需要转换属性
        var attrs = ele.attributes;
        var childNodes = ele.childNodes;
        forEach(attrs,function(attr,index){
            if (perFix.exec(attr.nodeName)) {
                //存在转换的属性,是否需要求值
                setTimeout(function(){
                    //把属性处理器提出执行列队
                    //避免在执行过程中污染原来的dom结构
                    attrHandle(attr.nodeName.substr(3),ele,attr.value);
                },0)
            }
        });

        if (ele.getAttribute("cc-each")) {
            return;
        }
        return ele;
    }
View Code

不管以怎样的形式存在,重要的是找到它们然后对它们作出响应的处理,所以创建一个处理它们的函数。

    function attrHandle(type,node,value){
        var newObj = buildExpression(value,originObj);
        switch (type) {
            case "each" :
                //创建一个文档碎片
                var fragment = document.createDocumentFragment();
                var i = 0;
                var l;
                var newNode;
                node.removeAttribute("cc-each");
                //判断是数组还是对象
                if (Object.prototype.toString.call(newObj) === "[object Array]"){
                    for (l = newObj.length;i<l;i++) {
                        newNode = node.cloneNode(true);
                        fragment.appendChild(eachNode(newNode,newObj[i]));
                    }
                    node.parentNode.replaceChild(fragment,node);
                }else{
                    for (var k in newObj) {
                        newNode = node.cloneNode(true);
                        fragment.appendChild(eachNode(newNode,newObj[k]));
                    }
                    node.parentNode.replaceChild(fragment,node);
                }
                break;
            case "click" :
                node.addEventListener("click",newObj,false);
                break;
            case "if" :
                if (newObj) {
                    node.style.display = "block";
                }else{
                    node.style.display = "none";
                }
                break;

        }

    }    

最后送上github地址:git@github.com:taixw2/temptale.git

本系列就草草结束,我发现比写代码更累的是管理好博客。

 

转载于:https://www.cnblogs.com/Amy-so/p/5636424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值