layui 动态加载script标签没有加载到dom树里面便执行table.render

layui 的数据表格功能非常强大,有的功能在应用的时候,因为不想写太多的代码,所以就能省则省,根据需要动态载入。比如,

表格的toolbar。可以根据不同的用户类型载入不同的tool按钮。这个时候就需要jq判断后,再动态确认是否需要载入某个按钮。

我们知道,表格的toolbar是基于页面上的

<script type="text/html" id="demon"><a>按钮一</a><a>按钮二</a></script>

这一个script块来加载实现的,所以如果动态加入按钮的话,需要如下方法实现:

let scripts='<script id="barDemo"><a>按钮一</a><a>按钮二</a></script>'
$('body').append(scripts)
table.render({
  cols: [[
    {field:'id', title:'ID', width:100}
    ,{fixed: 'right', width:150, align:'center', toolbar: '#barDemo'} //这里的toolbar值是模板元素的选择器
  ]]
});

但是出现一个问题,就是加载不上。遍查网络,搜到如下原因:

在append之后,DOM树更新了,但是浏览器的redraw还没有完成,这个时候对刚append上去的元素做操作是会失败的。比较简单的解决方案一个是加setTimeout,时间为0都可以(在我遇到的问题中是这样);或者,在append函数之后加.hide().show(),但是还不清楚如果是移动端,低端机上这样做元素会不会有闪动。

基于以上理由,首先添加了

setTimeout(function(){
    table.render({
    })},300)

来进行延迟加载,script标签上去了,但并没有被加载。最后在贤心祖师的指导下,改为了如下代码,终于加载成功。

let scripts='<div class="layui-hidden" id="barDemo"><a>按钮一</a><a>按钮二</a></div>'
$('body').append(scripts)
table.render({
  cols: [[
    {field:'id', title:'ID', width:100}
    ,{fixed: 'right', width:150, align:'center', toolbar: '#barDemo'} //这里的toolbar值是模板元素的选择器
  ]]
});

### Layui 中实现动态数据绑定 在 Layui 中,通过 `laytpl` 可以方便地实现实时模板渲染和数据绑定。下面是一个完整的示例来说明如何利用 `laytpl` 进行动态数据绑定以及条件判断。 #### HTML 结构 首先,在HTML文件中引入必要的Layui资源,并创建用于展示数据的容器: ```html <div id="demo"></div> <script type="text/html" id="itemTpl"> {{# layui.each(d,function(index,item){ }} <p>姓名:<span>{{ item.name }}</span></p> <p>年龄:<span>{{ item.age }}</span></p> <!-- 更多字段 --> {{# }); }} </script> <table class="layui-table" lay-data="{height:315, url:'/json', page:true}" id="testTable"> <thead> <tr> <th lay-data="{field:'name'}">姓名</th> <th lay-data="{field:'age'}">年龄</th> <!-- 定义更多列 --> </tr> </thead> </table> ``` #### JavaScript 部分 接着编写JavaScript代码完成数据加载与绑定操作: ```javascript // 假设这是从服务器获取的数据 var jsonData = [ {"id": "0", "name":"张三","age":"28"}, {"id": "1", "name":"李四","age":"22"} ]; // 使用 laytpl 渲染模版 layui.use(['element','util'], function(){ var element = layui.element; util = layui.util; // 获取DOM对象 var demoView = document.getElementById('demo'); var view = demoView.innerHTML; // 执行渲染,第一个参数是模板ID,第二个参数是要填充的数据源 demoView.innerHTML = laytpl($('#itemTpl').html()).render(jsonData); // 表格初始化配置 table.render({ elem: '#testTable' ,url:'/getJson' // 请求地址(模拟) ,cols: [[ // 列定义 {field: 'name', title: '姓名'} ,{field: 'age', title: '年龄'} // 添加其他需要显示的列... ]] ,page: true // 开启分页功能 }); // 设置监听器以便于处理行点击事件 table.on('row(testFilter)', function(obj){ console.log(obj.data); // 输出当行的数据 }); }); ``` 对于后台返回的是JSON字符串的情况,则可以先解析再使用: ```javascript $.post("/student/edit",{id:data.id},function(responseText){ try { var parsedData = JSON.parse(responseText); // 对parsedData做后续逻辑处理 } catch (e) { alert("Error parsing JSON!"); } })[^4]; ``` 当涉及到动态表头生成时,可以在端接收到服务端传来的元数据之后,根据这些信息构建表格结构并更新页面上的表格组件[^2]。 为了隐藏某些敏感信息比如中文属性名,可以通过修改键名为英文或其他形式后再传递给客户端;或者是在端通过自定义函数映射原始键值对到新的表示方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值