背景

最近使用了layui的前端框架,也在慢慢适应中,好多功能都已经封装得很实用,遇到不会的功能,看看官网的demo的文档,都还是可以解决的,毕竟咱们的模仿能力还是可以的。

记录一下昨天遇到的一个问题,就是我想在表格的头部工具栏,增加一个文件上传的接口,用于数据的批量导入,就简单的写了一个按钮,使用upload组件实现了功能,但是奇怪的事情发生了,第一次上传成功之后,页面不刷新,再次点击第二次的话,是无法上传文件,向后台发出请求的,最后排查的原因是,按钮上面的事件没有被渲染,导致上传组件无法与指定的按钮进行绑定。

问题重现

  • 在工具栏声明按钮,控件ID为import
<script type="text/html" id="headToolbarTpl"><input type="button" class="layui-btn layui-btn-sm" id="import" value="导入明细"/><input type="button" class="layui-btn layui-btn-sm" lay-event="download" style="margin-left: 10px" value="下载模板"/>
</script>
  • 调用upload组件,绑定控件按钮
 //指定允许上传的文件类型upload.render({elem: '#import', url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口, accept: 'file' //普通文件, acceptMime: '.xls,.xlsx', done: function (res) {if (res.code == 400) {table.reload(tableId);layer.msg(res.msg, {time: 4000}); else {table.reload(tableId);bindTableToolbarFunction();bnyKit.errorMsg(res.msg);}// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定bindTableToolbarFunction();}});

问题解决

方案一(原始方案,不推荐)

问题是在进行操作后,没有执行渲染事件,那么好,我在执行的每次动作之后,都重新执行一下渲染就可以。

  • 将渲染方法封装为一个函数
// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定function bindTableToolbarFunction() {// 绑定新增用户事件upload.render({elem: '#import', url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口, accept: 'file' //普通文件, acceptMime: '.xls,.xlsx', done: function (res) {if (res.code == 400) {table.reload(tableId);layer.msg(res.msg, {time: 4000});} else {table.reload(tableId);layer.msg('上传成功');layer.msg(res.data, {time: 5000, //20s后自动关闭btn: ['关闭']});}}});}
  • 在每个动作之后,都需要执行该函数,例如
 if (layEvent === 'details') {layer.open({type: 2, title: '明细详情', content: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/details?batchId=' + data.id, maxmin: true, area: area   // 宽高, btn: ['关闭'], yes: function (index, layero) {layer.closeAll();}});bindTableToolbarFunction();}
  • 我一开始使用了该方式,但是在测试之后发现,有的情况还是不可以,而且如果我在页面添加其他操作的话,都需要是执行渲染函数,虽然已经被封装为函数了,但是还是新操作还是会被污染。

方案二(推荐使用)

我们可以沿用layui提供了头部工具栏的功能,只是我需要去避免绑定按钮的失效渲染即可,
表格的工具栏模板如上,我猜想,每次在进行工具栏渲染的时候,一定是按照toolbarDemo这个id进行的,我的控件id,正式因为渲染才失效的,那么我是不是可以把按钮拿出来,然后进行上传组件的绑定呢,除此之外,lay-event这个控件还是正常使用,只是在lay-event事件处理的时候,再出发我的上传按钮的点击动作。

  • 第一步,将按钮拿到模板外面
<!--头部工具栏模板-->
<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入明细" style="display: none"/>
<script type="text/html" id="headToolbarTpl"><input type="button" class="layui-btn layui-btn-sm" lay-event="import" style="margin-left: 10px" value="导入明细"/><input type="button" class="layui-btn layui-btn-sm" lay-event="download" style="margin-left: 10px"value="下载模板"/>
</script>

注:由于我在模板中已经加了导入明细的按钮操作,所以我将自己声明的按钮隐藏掉,防止页面重复出现

  • 第二步:绑定生成的按钮事件,即绑定upload组件
        //指定允许上传的文件类型upload.render({elem: '#importFile', url: BASE_WEB + 'enterprisepoints/enterprisePointsBatch/importExcel' //改成您自己的上传接口, accept: 'file' //普通文件, acceptMime: '.xls,.xlsx', done: function (res) {if (res.code == 400) {table.reload(tableId);layer.msg(res.msg, {time: 4000});} else if (res.code == 200) {table.reload(tableId);//bindTableToolbarFunction();bnyKit.sucessMsg(res.msg)} else {table.reload(tableId);//bindTableToolbarFunction();bnyKit.errorMsg(res.msg);}// Layui的table在reload之后使用ID绑定的按钮失效,需要重新绑定//bindTableToolbarFunction();}});
  • 第三步,将event的时间处理,转到隐藏按钮的点击动作
 case 'import':$("#importFile").click();break;

总结

网上确实有好多人遇到这个问题,但是试了好多个方案,都不是很理想,其中还有使用table.render中的done函数的,但是也还是不行,遂自己总结一下,避免后面踩坑。

解决Layui表格头部工具栏事件绑定失效,上传文件按钮失效问题相关推荐

  1. bootdo监控后台上传文件定期失效

    bootdo上传文件定期上传不了,是因为临时文件夹被定期删除 解决:加入配置 spring.http.multipart.location=/var/tmp

  2. Layui表格头部工具栏

    开发工具与关键技术:VS2015,Javascript撰写时间:2019年6月16日 layui插件具有丰富而强大的功能,其中layui 的table组件也包含了许多用法,这些用法都很强大,而下面就来 ...

  3. 解决IE8下上传文件问题,无需flash,无需html5

    解决IE8下上传文件问题 场景:实现上传文件功能,重写上传按钮样式,并需要得到后台返回的数据来动态修改页面. 要求:不需要flash以及其他额外需要的东西. 尝试过的方法:1.webuploader. ...

  4. 上传文件时$_FILES为空,可能的原因及解决方法

    上传文件时$_FILES为空,可能的原因及解决方法 参考文章: (1)上传文件时$_FILES为空,可能的原因及解决方法 (2)https://www.cnblogs.com/i6010/articl ...

  5. 上传文件报错500或者文件大于2M上传不上去解决方法

    上传文件报错500或者文件大于2M上传不上去解决方法 参考文章: (1)上传文件报错500或者文件大于2M上传不上去解决方法 (2)https://www.cnblogs.com/sillong/p/ ...

  6. layui的轮播图片自适应大小_解决Layui 表格自适应高度的问题

    解决Layui 表格自适应高度的问题 鄙人在写一个项目,发现成功将数据在页面显示后, 高度没有自适应,而是将一些按钮遮挡了,不断的调试和网上寻找解决办法,发现没有效果,最后添加了一句css .layu ...

  7. Layui上传文件时choose事件只触发一次的问题(两种解决方案+最终解决方案源码)

    问题描述:使用layui的组件实现的文件列表添加和上传,第一次弹出此页面,可添加多个文件,点击上传,可以成功上传,但再次弹出此页面时,添加文件无法触发choose方法,上传依然是正常的,话不多说,看解 ...

  8. 解决上传文件或图片时选择相同文件无法触发change事件的问题

    昨天在做一个上传文件的模块时遇到了这样的问题:打开文件一上传,上传成功后再次点击文件一,change事件无反应 <input type="file" name="f ...

  9. 解决使用layui上传文件时提示“请求上传接口出现异常”

    在做网站的过程中,需要用户上传文件,接收文件的接口已经写好(经过测试确定可用) 现在需要在网页上提供一个文件上传的按钮.由于原生input type="file"组件太丑,考虑使用 ...

  10. 上传文件解决tomcat的临时目录失效问题

    项目场景: 今天测试又过来搞我,说平台的上传文件功能突然不能用了,上个月都测试得好好的 问题描述: 查看了系统服务日志,看到了一个错误,错误的意思是某个临时目录失效了,不存在了.如下 org.spri ...

最新文章

  1. Java Optional 的 orElse() 和 orElseGet() 的区别
  2. 校友会2019中国大学计算机,校友会2019中国大学一流专业排名800强出炉,北大清华复旦前三...
  3. JavaScript隐式类型转换
  4. [转载]如何高效、轻松地利用一天?
  5. Java内部类最细详解
  6. vue+webpack项目打包后背景图片加载不出来问题解决
  7. Cartographer源码阅读(4):Node和MapBuilder对象2
  8. Mac 下载并使用 Adobe Audition CC 2019 分离 人物语音和背景音乐
  9. Lenovo联想键盘关闭fn功能恢复F1-F12按键
  10. RS——485通讯协议
  11. cad打印本计算机未配置,为什么CAD点打印的时候会警告无法使用此绘图仪配置?...
  12. 广州北大青鸟软件工程师班课程简介
  13. 一行代码蒸发64亿?!形式化验证帮你一秒避免悲剧
  14. 国内算法竞赛平台汇总
  15. 如何添加BigBoss的Cydia源地址
  16. codeforces #630 F. Selection of Personnel
  17. Python调用腾讯优图OCR通用API实现文字识别
  18. mysql查询周数_MySQL如何获取一个指定日期所对应本年度的周数(WEEK函数)呢?
  19. 【Redis】初探Redis
  20. (转)创业靠撸不靠抽

热门文章

  1. 【CSDN浏览器助手】这款插件忒好用了
  2. 腾达无线路由器怎么建立服务器,腾达无线路由器网关和域名服务器
  3. Processing创意编程(熟练篇)
  4. 解密灰鸽子木马帝国【实在是恐怖呀】
  5. Qt多线程之QtConcurrent
  6. 垃圾邮件服务器 查询,邮件服务器ip黑名单查询
  7. PHP支付宝转账到支付宝账号
  8. css获取屏幕分辨率
  9. 深度学习(PyTorch)——shape、view、reshape用法及其区别
  10. shape (0,) 是什么意思