解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容

一、问题描述

在页面中使用laytpl.js模板引擎,在页面加载后无法使用jquery获取模板中的html元素,以下是图片和代码:

在添加或修改完毕后重新加载页面,不能使用jquery获取模板中的html元素,即点击table的tr不能改变该tr的颜色,不能使该tr的radio选中。

<div class="container">
        <div class="table-responsive">
            <table class="table table-bordered table-hover">
                <thead style="background-color: #f3f3f3">
                    <tr>
                        <th>
                            <%--<input type="checkbox" name="chkall" value=" " id="chkall" />--%></th>
                        <th>周日期</th>
                        <th>项目</th>
                        <th>添加时间</th>
                    </tr>
                </thead>
                <tbody id="tbody">
                    <script id="demo" type="text/html">
                        {{# for(var i = 0,len = d.length; i < len;i++){ }}
                        <tr>
                            <td>
                                <input type="radio" name="chkrow" value="{{ d[i].id }}" /></td>
                            <td>{{ d[i].zjhrq }}</td>
                            <td><a href="javascript:;" οnclick="article_edit('编辑周计划页面','planedit.aspx?id={{ d[i].id }}','2','800px','600px')">{{ d[i].title }}</a></td>
                            <td>{{ d[i].time }}</td>
                        </tr>
                        {{# } }}
                    </script>
                </tbody>
            </table>
        </div>
    </div>
<script>var tpl = document.getElementById("demo").innerHTML;
    function pageFun(curr, num) {
        if (!num) {
            num = 4;//当前查询数据量
        }
        var kword = $("#txt_info").val();
        $.ajax({
            url: "getplanpagenum.ashx",
            data: { page: curr || 1, num: num, keyword: kword },
            async: false,//解决无法获取tbody的tr问题,在页面加载后先调用此方法再使用选择器
            type: "post",
            success: function (returnData) {
                //var data = JSON.parse(returnData);
                laytpl(tpl).render(returnData[0], function (html) {
                    document.getElementById("tbody").innerHTML = html;
                });
                laypage({
                    cont: $("#page"),
                    pages: returnData[1][0].Total / 10,
                    skip: true,
                    curr: curr || 1,
                    groups: 3,
                    jump: function (obj, first) {
                        if (!first) {
                            pageFun(obj.curr, num);
                        }
                    }
                })
            }
        });
    }function trSelect() {
        $("tbody tr").click(function () {
            $(this).prop("style", "background-color:#ececec").siblings().prop("style", "background-color:#ffffff");
            $("tbody input:radio").removeAttr("checked");
            $(this).find("input:radio").attr("checked", true);
        });
    }<script>
<script type="text/javascript">
    $(document).ready(function () {
        pageFun();
        trSelect();
    });
</script>

二、问题分析

经过多次测试,发现可能是js执行顺序和ajax同步/异步问题导致的。在添加和修改功能的回调函数里面,执行的window.parent.pageFun();方法后,添加window.parent.trSelect();方法,解决该问题。

$.ajax({
                    url: "saveplaninfo.ashx",
                    data: data,
                    async: false,
                    type: "post",
                    success: function (returnData) {
                        layer.msg(returnData.Info);
                        if (returnData.State == "y") {
                            clear();
                        }
                        window.parent.pageFun();//执行父页面的pageFun();方法
                        window.parent.trSelect();
                    }
                });

三、总结

使用模板引擎插件一定要注意ajax的同步/异步方式和js执行顺序,如果加载完毕后的模板使用js或jquery获取不到,先从这两个方面考虑。

我说的不一定是对的,在此我只是记录我遇到的问题,如果有问题还请各位道友多多指点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
laytpl.render是Laytpl模板引擎用于渲染模板的方法。在使用Laytpl时,我们可以通过laytpl函数来创建一个模板实例,然后使用render方法将数据与模板进行渲染。具体使用方法可以参考引用和引用的示例代码。 在示例代码laytpl函数接收两个参数:模板字符串和数据对象。模板字符串是包含模板语法和变量的字符串,数据对象是提供给模板使用的数据。render方法会将模板字符串的变量替换为数据对象对应的值,生成最终的渲染结果。 需要注意的是,在模板字符串可以使用过滤器来对变量进行处理。引用给出了一个使用过滤器的示例代码。过滤器可以对变量进行一些特定的操作或转换,通过在模板使用{{variable|filter1|filter2|...}}的形式来表示。可以自定义过滤器,或者使用Laytpl提供的默认过滤器。 总结来说,laytpl.render是Laytpl模板引擎用于渲染模板的方法,通过将数据对象与模板字符串进行渲染,生成最终的结果。同时,可以使用过滤器对变量进行特定的处理。具体的使用方法可以参考引用和引用的示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解决layui的form里的元素进行动态生成,验证失效的问题](https://download.csdn.net/download/weixin_38673921/13666128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [laytpl模板引擎的入门教程及案例](https://blog.csdn.net/wgx_0504/article/details/130653703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值