兼容IE10上传并预览图片的方法(ie9暂时没有弄好)

18 篇文章 0 订阅
16 篇文章 0 订阅

以下代码会用到:1.jQuery   2.layui.all.js(要把整个插件downloaded)   3.jQuery.form.js

jQuery.form.js 使用很简单的,请参考:https://www.cnblogs.com/azhw/p/4661838.html

html:

 

<form id="designer_form" class="layui-form" lay-filter="designer_form"> <!-- 提示:如果你不想用form,你可以换成div等任何一个普通元素 -->
  <div style="height: 460px;">
    <div class="company-details">
        <div  class="layui-form-item">
          <p style="font-size: 14px;color:#666;margin-bottom:22px;">请上传您的设计师资格证书、个人名片或其它相关证书,有助于快速通过审核。</p>
          <div id="imgs" style="margin-bottom:14px;max-width:418px;overflow:hidden;white-space:nowrap;"></div>
          <div class="uploader" style="margin-bottom:12px;position:relative;">
            <input class="uploadInput" type="file"  multiple="multiple" accept="image/jpeg,image/png,image/jpg" style="width:102px;height:30px;display:none;"/>
            <img class="uploadImg" src="../img/register/upload-img-btn.jpg" height="30" width="102"/>
          </div>
          <span style="color:#999;">说明:图片可以不上传(若上传图片,最多只能上传 3 张)</span>
        </div>
    </div>
  </div>
  
  <div class="layui-form-item">
    <label class="layui-form-label"></label>
    <div class="layui-input-block">
      <button id="designer_registbtn" class="layui-btn" lay-submit lay-filter="designer_regist" style="margin-top: 30px;">立即注册</button>
    </div>
  </div>
</form>

js1:兼容IE10和IE9的图片预览部分

 

 

/****************************** 上传图片并且预览的方法 ******************************/
//这是间接触发<input type="file">的click事件
$(".uploadImg").click(function(){
  $(this).prev().click();
})
//图片上传,每次触发input会通过onchange来监听事件
$(".uploader").on("change",".uploadInput",function (obj){
  //region //处理<IE10不兼容的方法
  var $this = $(this);
  var oCurrentTarget = obj.currentTarget;
  if(og.isIE() && parseInt(og.IETester(navigator.userAgent)) < 10){
    //判断图片是否存在
    var existedImgs = $("div[data-flag='flag']","#imgs");
    var existedImgs_len = existedImgs.length;
    var bAppendImg = true;
    if(existedImgs_len >= 3){
      layer.msg('最多只能上传3张图片',{time:og.ogLayerTime,icon:5});
      return false;
    }
    if(existedImgs_len > 0){
      existedImgs.each(function(i,eleDom){
        var existedImg = $(eleDom).data('img');
        var exiImgName = existedImg.value.substring(existedImg.value.lastIndexOf("\\") + 1);
        var exiImgSize = existedImg.size;
        if(oCurrentTarget.value.substring(oCurrentTarget.value.lastIndexOf("\\")+1) == exiImgName && oCurrentTarget.size == exiImgSize){
          layer.msg('该图已经存在,不能重复上传',{time:og.ogLayerTime,icon:5});要引入layui.js
          bAppendImg = false;
        }
      })
    }
    if(bAppendImg){
      var html = "";
      html += "<div style='display: inline-block;position:relative;'>";
      html += "<div class='imgSet' style=\"width:100px;height:64px;margin-right:5px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="+obj.currentTarget.value+")\" data-flag='flag'></div>";
      html += "<span onclick='$(this).parent().remove();' class='deleteButton'style=\"position:absolute;right:8px;top:0;color: red;cursor:pointer;\"><i class='fa fa-window-close'></i></span>";
      html += "</div>";
      $("#imgs").append(html);
      var img = $("div[data-flag='flag']",'#imgs').last();
      img.data("img",oCurrentTarget);//将file放到img当中
    }

    $(this).remove();//清空刚才选中的图片(PS:bug,因为若选中a,如果重新选择a,就不会触发change事件, 所以要清空file)
    $(".uploadImg").before('<input class="uploadInput" type="file"  multiple="multiple" accept="image/jpeg,image/png,image/jpg1" style="width:102px;height:30px;display:none;"/>');

    //region  /*为解决bug,而执行的让file清空的两种方法,在ie9试验均没有起效果*/

    //清空刚才选中的图片(PS:bug,因为若选中a,如果重新选择a,就不会触发change事件, 所以要清空file)
    //清空file方法一:
    //this.select();
    //document.selection.clear();

    //清空file方法二:
    //this.outerHTML = this.outerHTML;
    //endregion
    return false;
  }
  //endregion

  //这里files是数组,因为可以一次选多张图片
  var files = obj.target.files || obj.dataTransfer.files;//js获取所有文件 ie10以下不支持
  //var files = $(obj).get(0).files;//jquery获取所有文件
  if (imgFilter(files) == false) {//过滤
    return false;
  }

  //判断上传的图片跟页面上的图片,如果已经上传了,不需要重新上传
  var imgList = $("img[data-flag='flag']");//获取所有的img
  $.each(files, function (i, item) {//正在上传的files(item = 每一个file)
    if(files.length >3){//最多只能上传3张图片
      layer.msg('最多只能上传3张图片',{time:og.ogLayerTime,icon:5});
      return false;
    }

    var objUrl = getObjectURL(item);//每一个files 的file(item)转为路径

    var a = true;//用于过滤掉,页面已经选中的图
    if(imgList.length > 0){//已经有选中的图片
      $.each(imgList, function (j, val) {//已经存在的file 信息存在data-img中
        var fileName = $(val).data("img").name;
        var fileSize = $(val).data("img").size;
        if(fileName == item.name && fileSize == item.size){
          layer.msg('该图已经存在,不能重复上传',{time:og.ogLayerTime,icon:5});
          a = false;
        }
      });
    }

    if(imgList.length >= 3){//最多只能上传3张图片
      layer.msg('最多只能上传3张图片',{time:og.ogLayerTime,icon:5});
      a = false;
    }

    if (a) {
      var html = "";
      html += "<div style='display: inline-block;position:relative;'>";
      html += "<img class='imgSet' style=\"width:100px;height:64px;margin-right:5px;\" data-flag='flag' src='" + objUrl + "'>";
      html += "<span onclick='$(this).parent().remove();' class='deleteButton'style=\"position:absolute;right:8px;top:0;color: red;cursor:pointer;\"><i class='fa fa-window-close'></i></span>";
      html += "</div>";
      $("#imgs").append(html);
      var img = $("#imgs>div").last().children("img");//获取#imgs最后的一个div(新生成)生成的img标签
      img.data("img",item);//将file放到img当中
    }

  })

  $this.val("");//清空刚才选中的图片(PS:bug,因为若选中a,如果重新选择a,就不会再触发change事件所以必须要清空file)
});

//获取文件地址,显示预览用
var getObjectURL = function (file) {
  var url = null;
  if (window.createObjectURL != undefined) {//基础创建url的方法
    //在每次调用createObjectURL()方 法的时候,都会创建一个新的对象URL,即使参数中的这个对象已经有了自己的对象URL.在你不需要这些对象URL的时候,
    // 你应该通过调用 window.URL.revokeObjectURL()方法来释放它们所占用的内存.虽然即使你不主动释放它们,浏览 器也会在当前文档被卸载的时候替你释放,
    // 不过,考虑到更好的性能和更少的内存占用,你应该在安全的时候主动施放它们.
    url = window.createObjectURL(file);
  } else if (window.URL != undefined) { // mozilla(firefox)
    url = window.URL.createObjectURL(file);
  } else if (window.webkitURL != undefined) { // webkit or chrome
    url = window.webkitURL.createObjectURL(file);
  }
  return url;
};

//图片过滤
var imgFilter = function (files) {
  var a = true;
  for (var i = 0, file; file = files[i]; i++) {
    if (file.type.indexOf("image") == 0) {//
      if (file.size >= 1048576) {// 1M
        layer.alert('您这张"' + file.name + '"图片过大,应小于1M,请重新上传');
        a = false;
      }
    } else {
      layer.alert('文件"' + file.name + '"不是图片。请重新上传');
      a = false;
    }
  }
  return a;
}

js2:提交图片到后台

 

 

//封装的公用代码片段
var og = {
  //14.判断ie浏览器
  isIE:function(){ //ie?
    if (!!window.ActiveXObject || "ActiveXObject" in window){
      return true;
    }else{
      return false;
    }
  },
//14.1判断ie浏览器
//region //IE6~IE10的浏览器特征明显,存在msie字符串,而IE11去掉了msie字符串,可以通过rv后面的版本号识别IE11
//IETester();//不传参数返回当前IE版本,如果不是IE内核浏览器,返回false
//IETester('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko');//传userAgent字符串,用来判断其他IE浏览器的版本,该示例返回11.0
  IETester : function(userAgent){
    var UA =  userAgent || navigator.userAgent;
    if(/msie/i.test(UA)){
      return UA.match(/msie (\d+\.\d+)/i)[1];
    }else if(~UA.toLowerCase().indexOf('trident') && ~UA.indexOf('rv')){//~ ~
      return UA.match(/rv:(\d+\.\d+)/)[1];
    }
    //return false; 不是ie就不查了
  }
//原来的函数写法:对于新版的ie11已经不支持了
// function isIE(){
//   if (window.navigator.userAgent.indexOf("MSIE")>=1)
//     return true;
//   else
//     return false;
// }
  ,  //定义全局的layerTime时间
  ogLayerTime:1500,//要引入layui.js
}

//这是提交到后台的代码:
if(og.isIE() && parseInt(og.IETester(navigator.userAgent)) < 10){//小于IE10用这个方法提交
  var options = {
    //target: '#output1',
    data:{param1:"我自己的第一个额外的参数"},
//这个参数是指通过ajax来给服务器提交除了form内部input的参数
//在后台中使用String param1=req.getParameter("param1");获取。
    // dataType: null,
    dataType:'json',
//这个参数值的是服务器返回的数据类型,默认的是null
//也就是服务器可以默认返回字符串,然后将这些字符串放在target内部
//当然还有json、xml,其中最常用的便是null和json
//对于json的使用,我们会稍后讲解到
    // beforeSubmit: showRequest,

    type:'post',
    //提交方式,默认是自己在form标签上指定的method
    //如果没有指定,则使用get。
    url:'/user/register',
    //重新提交的url,即url可以在form中配置
    //也可以在这里配置。
    success:function(data){
      if(data){
        alert(data);
      }
      console.log(data);
    }
  };

  $('#designer_form').submit(function() {//这里用了jQuery.form.js 使用方法,请参考:https://www.cnblogs.com/azhw/p/4661838.html
    $(this).ajaxSubmit(options);
    return false;
    //非常重要,如果是false,则表明是不跳转
    //在本页上处理,也就是ajax,如果是非false,则传统的form跳转。
  });


}else{
  //获取图片,放到form中
  var imgList = $("img[data-flag='flag']");//这个图片可能是多张,所以是一个数组
  var formdata = new FormData($("#designer_form")[0]);
  $.each(imgList, function (j, value) {//添加图片到formdata中,我们只要用同一个name提交到后台,java后台接收的时候用循环的方式取出多张图即可
    formdata.append("Image_files", $(value).data("img"));//"Image_files"是后台参数名,图片file数据保存在.data("img")中
  });
  layer.load();
  $.ajax({
    url: "/user/register",
    type: "POST",
    data: formdata,
    cache:false,
    processData: false,  // 告诉jQuery不要去处理发送的数据
    contentType: false,   // 告诉jQuery不要去设置Content-Type请求头
    success:function(data){
      layer.closeAll("loding");
      if(data.status){
        layer.msg("注册成功",{time:og.ogLayerTime,icon:6});
        $("form").each(function(index,eleDom){//将每个form的数据清空
          eleDom.reset();
        })
      }else{
        layer.alert(data.message);
      }
    },
    error:function(err){
      layer.closeAll("loding");
      layer.alert(err);
    }
  });
}

小结:以上是我的项目中用到的代码,只差IE9提交到后台的那个部分没有实现,后面有时间会补充。

    cache:false,
    processData: false,  // 告诉jQuery不要去处理发送的数据
    contentType: false,   // 告诉jQuery不要去设置Content-Type请求头
用$.ajax({})提交formdata,一定要设置上面的三个参数,否则jQuery会报匿名非法调用:Uncaught TypeError: Illegal invocation

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值