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

背景

最近使用了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函数的,但是也还是不行,遂自己总结一下,避免后面踩坑。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Windows XP电脑维护工具箱是一个集系统设置、优化、修复及网络共享、安全防御、个人隐私等于一身的装机维护必备工具。该工具短小精悍,功能齐全,除常规的系统方面的维护外,更有IE主页锁定,禁止程序运行,屏蔽网址,文件夹加密,个人资料及宽带账号转移等综合功能。其中的浏览器安全启动可避免看网页中毒,高级用户设置更能满足用户多方面需要。功能还有很多,不便详述。总之,有此工具,别无它求! 01,电脑属性设置,设置系统的一些OEM信息,OEM赞助商信息需在非“经典开始菜单”下显示。 02,系统优化与修复 A、XP系统终极优化加速:包含很多注册表的优化,可加速电脑启动及运行速度,推荐使用; B、文件夹选项关联修复:文件夹选项不正常,或打不开EXE、TXT等常规文件错误时使用; C、桌面IE相关图标修复:开机显示不了桌面,淘宝购物等恶意IE伪图标无法删除等相关修复; D、输入法小喇叭等修复:任务栏异常,输入法切换失效及音量小喇叭重启后消失不见了问题; E、能上QQ不能上网修复:电脑网络正常,可是可以登录QQ旺旺等,却无法开网页时使用; F、IE新网页打不开修复:可以打开网页,但再次点击网页里的链接就没反应打不开时使用; G、内存不能为read修复:电脑时不时就弹出内存不能为read修复,修复后建议杀毒清理插件; J、XP系统疑难彻底修复:开机桌面没有图标,进不了安全模式等莫名其妙的问题时使用; 03、文件打印共享 A、完全禁用文件和打印共享:家庭电脑无需网络共享时推荐使用,可加强电脑的安全性; B、启用文件和打印共享(无验证):公司局域网需共享文件打印机时推荐使用,此时不需密码验证; C、启用文件和打印共享(需验证):公司局域网需共享文件打印机时推荐使用,此时需密码验证; D、查看当前共享状态:查看当前系统的共享状态; 04、系统垃圾清理 A、系统常规垃圾清理:清理一些TEMP等常规临时文件,推荐删除; B、系统更新残留补丁清理:清理系统升级更新补丁后残留下来的临时文件,推荐删除; C、操作系统使用痕迹清理:清理如打开过的文档记录,网页记录等使用电脑的痕迹,推荐全选删除; 05、网络安全防御 A、网址屏蔽恢复:输入网址,点击屏蔽后,该网址将无法打开;下拉提供恢复选项; B、删除所有启动项目:系统中毒非常严重时使用,可删除所以电脑启动后自动打开的程序; C、锁定注册表及任务管理器:锁定后将无权打开注册表及任务管理器,提供解禁项; D、自动建立宽带连接:宽带用户可使用该项自动建立宽带连接,方便宽带拨号上网使用; E、自定义本地连接IP模式:如自动获取,手动设置,智能绑定等,推荐使用智能绑定; F、关闭多余空闲IDE通道:可加速电脑启动过程,推荐使用,如重启后有问题使用F8最后一次配置启动; G、我要离开锁定本计算机:也就是通常说的挂机锁,锁住屏幕,输入密码后恢复正常; H、U盘只读禁止写入:执行后将不能再往U盘里存入数据,解禁后恢复正常U盘功能; I、进入安全上网模式:看--H--站时推荐使用,执行后打开浏览器安全上网,退后后记得恢复原来模式; J、自动运行autorun免疫:可避免双击磁盘病毒就运行,推荐使用; K、防止ARP网速受限免疫:可防止局域网内自己网速被人控制受限,提供自己的网速,推荐使用; L、撤销ARP网速受限免疫:可解决自身P2P终结者等限速软件无法使用的问题; M、文件粉碎:把你无法删除的文件拖入到此处,点击粉碎即可快速删除; M、QQ强制聊天:无需加对方为好友,输入对方QQ号,点击开聊即可建立临时对话; O、浏览器安全启动:下拉选择浏览器,将以第三方运行,可防止病毒入侵,浏览----H---站时推荐使用; 06、其他综合设置 A、IE主页设置:主页设置,主页无法设置等修复,同时提供锁定主页功能; B、系统设置:系统相关设置,如无法打印、打印任务无法删除可启动打印机;及其它系统相关设置; C、服务设置:追求完美的高级用户可选择相关选项进行设置,一般用户不推荐使用; D、辅助程序:罗列了一些常用的Windows命令,方便实用; F、禁止运行:输入你不想运行的程序,如输入QQ.EXE ,那你打开QQ后将无法运行,下拉可选恢复; G、文件夹加密:默认密码为888888,进去后可修改。一个盘符一个密码,方便加密U盘移动硬盘资料; 08、个人资料转移 A、IP及宽带上网账户密码:可以备份您的宽带账户密码及IP设置,方便重装系统后使用; B、个人资料转移:推荐重装系统或刚装新系统时使用,以便防止资料丢失,加快系统速度; 等等N多的功能,在这里就不一一详解了,大家好好使用吧!!!!!!!!!!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值