jQuery-File-Upload不兼容IE8解决方案

jQuery-File-Upload不兼容IE8解决方案

jQuery-File-Upload ADD方法没调用

 

 

================================

©Copyright 蕃薯耀 2018年12月27日

http://fanshuyao.iteye.com/

 

一、问题描述:

在IE8模式下

<meta http-equiv="X-UA-Compatible" content="IE=8" />

 jQuery-File-Upload点击上传文件按钮选择文件后出现无反应、文件不上传的问题

 

 

二、解决方案:

1、首先看Html代码:

 

<a id="btnUploadMdbFile" href="javascript:;" class="plui-linkbutton" >上传mdb文件</a> 
<div style="display: none;">
    <input id="inputUploadMdbFile" type="file" name="mdbFiles" />
</div>

 引用的js

<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.ui.widget.js"></script> 
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.iframe-transport.js"></script>	
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.fileupload.js"></script>	

 

通过一个A标签的按钮的点击,去触发选择文件上传type="file"的控件,这样页面美观,用户体验好,这个操作在IE11是可以正常上传的。

 

但在IE8模式下,jQuery-File-Upload不能正常上传,选择文件后无反应、无法自动上传文件。

 

2、js调试问题

发现选择文件后,jQuery-File-Upload的ADD方法并未调用。就是文件没有被添加到jQuery-File-Upload中,即jQuery-File-Upload识别不到上传的文件。

网上查找原因,说是:

IE8出于安全性,不允许这么做

IE doesn’t allow manipulation of the type=”file” input element from javascript due to security reasons. Setting the filename or invoking a click event to show the browser dialog will result in an “Access is denied” error on the form submit.

 

3、jQuery-File-Upload上传原理

a、对某个file input标签执行 upload插件的初始化方法后,插件会监听这个file input的change事件

b、当选择文件的时候,会触发change事件

 

if ($.support.fileInput) {
     this._on(this.options.fileInput, {
         change: this._onChange
     });
}

c、在_onChange处理函数中,会遍历files,触发upload插件的change方法

d、当change函数返回true的时候,会触发upload插件的add方法

e、在upload插件的回调函数中,会传入两个参数,fn(事件信息, 数据对象)

f、在upload插件的add方法中可以执行自己写的逻辑

例如想判断文件后缀是否满足条件,插件自带的参数 acceptFileTypes 在简化模型中不起作用,我们可以在change和add方法中判断,如果不满足返回false即可,如果通过可以直接执行data.submit()进行提交

add: function(e, data){
  //var acceptFileTypes = /^(gif|jpe?g|png)$/i;//图片
  var acceptFileTypes = /^mdb$/i;
  var files = data.originalFiles;
  if(files && files.length > 0){
    var isPass = true;
    for(var i=0; i<files.length; i++){
        var name = files[i]["name"];
        var lastIndex = name.lastIndexOf(".");
        if(lastIndex < 0){
            isPass = false;
            break;
        }else{
            var fileType = name.substring(lastIndex + 1);
            if(!acceptFileTypes.test(fileType)){
                isPass = false;
                break;
            }
        }
    }
    if(!isPass){
        top.$.messager.alert("系统提示","只能上传类型为*.mdb的文件","info"); 
        return;
    }
        top.loading("文件上传中,请等待…");
        data.submit();
    }
}

g、当上传成功会执行done函数(响应成功),失败则会执行fail函数

 

 就是由于IE8的原因,导致jQuery-File-Upload没有触发到onchange事件,导致识别不到文件,没有调用add方法。

 4,修改Html代码

<div style="display: inline-block;position: relative;">
    <a id="btnUploadMdbFile" href="javascript:;" class="plui-linkbutton" >上传mdb文件</a> 
    <input id="inputUploadMdbFile" type="file" name="mdbFiles" style=""/>
</div>	

 

5、增加css代码

<style type="text/css">
#inputUploadMdbFile{
	position: absolute;
	width: 100%;
	height: 100%;
	top: 0;
	right: 0;
	opacity:0;
	filter:alpha(opacity=0);
	cursor: pointer;
}
</style>

 

 6、解决原理

利用绝对、相对定位,把上传组件(type="file")定位在按钮上面,然后把上传组件的透明度设置成0,达到隐藏的效果,当点击按钮时,其实是点击了上传组件,这样避免IE隐藏上传组件的问题。

 

 

 

 

资料参考:

https://blog.csdn.net/huangpin815/article/details/72888340

https://www.cnblogs.com/tgwang/p/4629645.html

 

================================

©Copyright 蕃薯耀 2018年12月27日

http://fanshuyao.iteye.com/

 

 

 

 

猜你喜欢

转载自fanshuyao.iteye.com/blog/2435777
今日推荐