WebUploader 上传插件结合bootstrap的模态框使用时选择上传文件按钮无效问题的解决方法

由于种种原因(工作忙,要锻炼健身,要看书,要学习其他兴趣爱好,谈恋爱等),博客已经好久没有更新,为这个内心一直感觉很愧疚,今天开始决定继续更新博客,每周至少一篇,最多不限篇幅。

今天说一下,下午在工作中遇到的一个问题:公司的后端同事用bootstrap的模态框,结合WebUploadder做后台上传文件的功能的时候,发现上传按钮点击无效。同事过来请求我支援,我研究了下,发现了三种解决方案,下面具体说说是这三种方法是怎么解决的。

我们先来分析一下解决这个问题的思路:

为什么上传控件放到模态框里面就不行了呢?而不在模态框的正常dom下却是可以的。我猜测导致问题的原因是因为模态框的dom结构刚开始是隐藏的元素display:none,而对diaplay:none的元素执行js,是不会生效的,要解决这个问题,我们就要在模态框渲染完之后,模态框对应的dom节点在页面上都加载完成之后重新去执行上传控件的js。于是出现了下面三种解决方案。

方案一:

使用uploader.refresh();

在模态框加载完成之后,执行这个函数,代码如下。

    //create()
    var uploader = WebUploader.create({
        // swf文件路径
        swf:‘webuploader/Uploader.swf‘,

        // 文件接收服务端。
        server: ‘http://webuploader.duapp.com/server/fileupload.php‘,

        // 选择文件的按钮。可选。
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: ‘#picker‘,

        // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
        resize: true
    });
    $(‘#myModal‘).on(‘shown.bs.modal‘, function () {
       uploader.refresh();//在模态框加载完成之后执行重绘按钮的方法。
    });

方案二:

在模态框加载完成之后,重新绘制按钮。

代码如下:

 1 var uploader = WebUploader.create({
 2         // swf文件路径
 3         swf:‘webuploader/Uploader.swf‘,
 4
 5         // 文件接收服务端。
 6         server: ‘http://webuploader.duapp.com/server/fileupload.php‘,
 7
 8         // 选择文件的按钮。可选。
 9         // 内部根据当前运行是创建,可能是input元素,也可能是flash.
10         pick: ‘#picker‘,
11
12         // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
13         resize: true
14     });
15     function create(){
16        uploader.addButton({
17        id: ‘#picker‘,
18        innerHTML: ‘选择文件‘
19        });
20     }
21     $(‘#myModal‘).on(‘shown.bs.modal‘, function () {
22       //uploader.refresh();
23        create()
24     });

方案三:

在模态框执行完之后再执行,上传控件按钮的js

 1 var uploader = null;
 2     $(‘#myModal‘).on(‘shown.bs.modal‘, function () {
 3         //uploader.refresh();
 4         //create()
 5         uploader = WebUploader.create({
 6         // swf文件路径
 7         swf:‘webuploader/Uploader.swf‘,
 8         // 文件接收服务端。
 9         server: ‘http://webuploader.duapp.com/server/fileupload.php‘,
10
11         // 选择文件的按钮。可选。
12         // 内部根据当前运行是创建,可能是input元素,也可能是flash.
13         pick: ‘#picker‘,
14
15         // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
16         resize: true
17         });
18     });
19     //关闭模态框销毁WebUploader,解决再次打开模态框时按钮越变越大问题,同时为了节约内存,销毁不必要的内存开销。
20     $(‘#myModal‘).on(‘hide.bs.modal‘, function () {
21         uploader.destroy();
22     });

注意第三种方法,必须要在关闭模态框之后执行上传控件销毁事件,以节省内存开销。

模态框渲染过程中不同生命周期如何调用函数,可以查看bootstap的模态框api,

从这个例子中,需要了解,开发一个控件的时候,一定要定义方法能够对不同的周期进行控制,并且要定义销毁控件的方法,只有这样才是一个完整的好用的控件,通过这个案例对vue的生命周期函数也有了更进一步的理解。

原文地址:https://www.cnblogs.com/xinggood/p/8760155.html

时间: 2024-08-04 00:29:31

WebUploader 上传插件结合bootstrap的模态框使用时选择上传文件按钮无效问题的解决方法的相关文章

Bootstrap 实例 - 模态框(Modal)插件

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bootstrap 实例 - 模态框(Modal)插件</title> <link rel="stylesheet" href="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.m

bootstrap 嵌套模态框 二级模态框关闭导致一级模态框滚动条消失

一.问题描述 实际开发中遇到bootstrap嵌套模态框,关闭次模态框后主模态框滚动条消失. 二.解决办法 在主模态框上加属性:(先凑合着用,回头再看看源码) style="overflow-y: auto;" 问题:在使用Bootstrap时,有时候会用到模态框中再嵌套模态框.这样就会出现一个问题,就是在关闭第二个模态框时,会导致第一个模态框的滚动条消失,这样就会使得屏幕太小而模态框太大看不到底部信息,而没法进行操作. 解决方法:就是在第二个模态框的关闭hide 方法调用之后立即触发

Bootstrap model模态框与百度地图API发生冲突时的解决办法

在使用百度地图API的过程中,当我需要在infoWindow的按钮点击触发modal模态框时,就会发现bootstrap的模态框会失效.弄清modal的原理就可以通过自定义modal的css样式和modal方法来解决这个问题.Bootstrap modal模态框的原理是通过控制modal框div的visibility属性来变化来实现的,在初始状态modal div的visibility属性值为hidden,在页面上隐藏,当点击按钮触发(或别的事件)一个方法使div的visibility值变为vi

bootstrap删除模态框弹出并询问是否删除【通用删除模态框】

普通的询问是否删除的对话框比较low,可以利用bootstrap的模态框代替普通的对话框来实现删除. 效果: 点删除的时候弹出模态框询问是否删除,点确认的时候将需要删除的ID传到后台进行删除.  过程: 1.界面准备删除模态框: 模态框中隐藏需要删除的ID <!-- 模态框 信息删除确认 --> <div class="modal fade" id="delcfmOverhaul"> <div class="modal-dia

Bootstrap.之模态框 显示在遮罩层后面

Bootstrap.之模态框 显示在遮罩层后面 问题描述: 在使用bootstrap模态框,弹出的窗口在遮罩层后面,见图: 解决方案: 保证模态框的代码,所在的上一级(父元素)是body标签,即可.例如: 原文地址:https://www.cnblogs.com/Charles-Yuan/p/11976302.html

Bootstrap 的模态框类

Bootstrap 的模态框类提供了一些事件用于监听并执行你自己的代码. 事件类型 描述 show.bs.modal show 方法调用之后立即触发该事件.如果是通过点击某个作为触发器的 元素,则此元素可以通过事件的relatedTarget 属性进行访问. shown.bs.modal 此事件在模态框已经显示出来(并且同时在 CSS 过渡效果完成)之后被触 发.如果是通过点击某个作为触发器的元素,则此元素可以通过事件 的 relatedTarget 属性进行访问. hide.bs.modal

bootstrap的模态框的使用

bootstrap的模态框 如果只想单独使用模态框功能,可以单独引入modal.js,和bootstrap的css,在bootstrap的包中,可引入bootstrap.js. 用法 通过data属性,比如设置某个butto的data-toggle=’“modal”,同时设置 data-target="#myModal" 选择器内容,通过js直接用代码 $(’#myModal’).modal(options)模态框主要为三部分,model-head,modeal-body,model-

Bootstrap 中 模态框插件(十)(持续更新中。。。)

模态框的弹窗组件需要三层 div 容器元素(一般用于登录和注册) .modal     //  模态声明层 .modal-dialog     //  窗口声明层 .modal-content     //  内容层 .modal-header     //  内容头部层 .modal-body     //  内容主体层 .modal-footer     //  内容注脚层 .modal-title     //  内容标题,去掉边距 .show     //  表示显示,默认是隐藏

bootstrap之模态框

虽然现在开源社区上有各种功能强大的模态JS框库或JS插件,但大都需要依赖jQuery, 对于使用Zepto的移动端来说不太适合,而且很多功能都不需要.其实要实现一个简单的模态对话框,只需几行HTML+css+js代码就能搞定. 首先在html上定义两个div元素,其中外层div表示模态框外面的覆盖层(overlay layer), 内层的div表示模态框 ? 1 2 3 4 5 6  <div id="modal-overlay">      <div class=&