其他分享
首页 > 其他分享> > JS模板引擎 TiniestTpl.js 在实际运用中的遇到的一个BUG

JS模板引擎 TiniestTpl.js 在实际运用中的遇到的一个BUG

作者:互联网

《再也没有比这更快的JS模板引擎:TiniestTpl.js》在实际运用中的遇到的一个BUG解决

模板代码:

<div id="test">
    <table>
        <tr>
            <td>{%=data.name%}</td>
        </tr>
        {% for (let idx in data.list) { %}
        <tr>
            <td>{%=data.list[idx]%}</td>
        </tr>
        {% } %}
    </table>
</div>

使用 $('#test').html() 或 document.getElementById('test).innerHtml,获取的HTML代码,均会变成下述样子:


{% for (let idx in data.list) { %}

{% } %}
<table>
    <tbody>
        <tr>
            <td>{%=data.name%}</td>
        </tr>
        <tr>
            <td>{%=data.list[idx]%}</td>
        </tr>
    </tbody>
</table>

原本插入在 <table>的<tr>与<tr>之前的 {% for (let idx in data.list) { %} 和 {% } %}位置发生的改变,因此该模板无法成功的渲染显示。

经过发现,只有使用<!-- -->时,位置不会发生改变,模板修改如下:

<div id="test">
        <table>
            <tr>
                <td><!--%=data.name%--></td>
            </tr>
            <!--% for (let idx in data.list) { %-->
            <tr>
                <td><!--%=data.list[idx]%--></td>
            </tr>
            <!--% } %-->
        </table>
    </div>

获取的html源代码:

<table>
    <tbody>
        <tr>
            <td>
                <!--%=data.name%-->
            </td>
        </tr>
        <!--% for (let idx in data.list) { %-->
        <tr>
            <td>
                <!--%=data.list[idx]%-->
            </td>
        </tr>
        <!--% } %-->
    </tbody>
</table>

修改后的 TiniestTpl.js

(function (options) {

    window.tiniest = {
        'tplCache': {}
    };

    tiniest.tpl = function (html, data, fstr = '') {
            if (typeof html != 'string' || !html) {
                    return '';
                }
        if (typeof tiniest.tplCache[html] == 'function') {
            return data ? tiniest.tplCache[html](data) : tiniest.tplCache[html];
        }
        let tmp = html.replace(/[\r\n\t]/g, " ").split(/<!--%/g);
        for (let i = 0; i < tmp.length; i++) {
            if (tmp[i][0] == '=') {
                let end = tmp[i].indexOf('%-->');
                fstr += "str +=" + tmp[i].substr(1, end - 1) + "+'" + tmp[i].substr(end + 4) + "';";
            } else if (tmp[i].lastIndexOf('%-->') > 0) {
                let end = tmp[i].indexOf('%-->');
                fstr += tmp[i].substr(0, end - 1) + "str += '" + tmp[i].substr(end + 4) + "';";
            } else {
                fstr += "str += '" + tmp[i] + "';";
            }
        }
        fstr = "func = function(data) { let str=\"\"; " + fstr + " return str; };";
        tiniest.tplCache[html] = eval(fstr);
        return data ? tiniest.tplCache[html](data) : tiniest.tplCache[html];
    }
}());

标签:tmp,tiniest,js,html,TiniestTpl,fstr,data,BUG,tplCache
来源: https://blog.51cto.com/u_12641643/2763508