• JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)


    需要解决的问题有:本地图片如何在上传前预览、编辑;
    最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼容。
    代码实现主要利用到jquery插件imgAreaSelect,FileReader对象(chrome和ff获取本地图片数据的接口),IE滤镜效果。

    关键词:imgAreaSelect FileReaderdocument.selection.createRange() IE滤镜效果

    一、实现上传前预览
    1.1、页面显示

    代码1-1显示的是html需要展示的web页面信息

    01 <!—预览图片显示区域-->
    02 <div id=”image_area”>
    03 <img id="biuuu"src="#" title="biuuu">
    04 </div>
    05 <!—图片上传区域-->
    06 <div id =”upload_area”>
    07 <form name "form1"action =' /person?c=changeAtvatar' enctype 'multipart/form-data'method 'POST'>
    08 <input type="file"id="picpath" name="atvatar_image">
    09 <a href="javascript:void(0);"class="button"> 上传照片</a>
    10 <input type='text'name="path" readonly>
    11 <div id = “submit_button”>
    12 <a href="javascript:void(0);"class='button'>确认</a>
    13 </div>
    代码1-1

    为了修改input file的按钮名称,我们添加了一段代码,这个在第二节将会详细说明

    1 <a href="javascript:void(0);" class="button">上传照片</a>
    2 <input type='text'name="path" readonly>

    1.2、实现预览在线编辑
    这里我们主要使用了一个插件进行图片编辑,如果需要具体查看学习可查看网址
    http://odyniec.net/projects/imgareaselect/,使用方法还是很简单方便的。

    01 $('#biuuu').imgAreaSelect({
    02 aspectRatio:'1:1'//截取比例
    03 show:true,
    04 resizable:true//是否可调整大小
    05 autoHide: false,//选择框选择完毕是否自己取消
    06 handles:true,
    07 key:true//是否启用键盘,默认为false
    08 //x1: 75, y1: 30, x2:225, y2: 180, //需要处理的区域,原始的
    09 //x1:左上角x轴坐标 y1:左上角y轴坐标 x2:右下角x轴坐标 y2:右下角y轴坐标
    10 keys: { arrows: 1,ctrl: 5, shift: 'resize' }, //调整像素大小
    11 //onInit:function(img, selection) { ias.setSelection(100, 50, 250, 150, true);ias.update(); }, //设置初始函数 画出选择框
    12 onSelectChange:preview //选框移动时触发的事件
    13 //onSelectEnd:function(img, select){alert(select.width)} //选框结束时触发的事件
    14 });
    代码1-2

    代码1-2主要是设置需要编辑图片的一些插件属性,具体查看插件的参量说明。
    首先我们需要创建一个预览小图片在img之后

    1 $('<div><imgid="view" src='+atvatarUrl+' style="position: relative;"/></div>')
    2 .css({
    3 float: 'left',
    4 position:'relative',
    5 overflow:'hidden',
    6  '100px',
    7 height: '100px'
    8 }).insertAfter('#biuuu');//把新建元素放到 #biuuu 之后
    代码1-3

    代码1-3是创建一个小预览图片在img之后

    1.3、实现在线预览功能

    01 function previewImage(file)
    02 {
    03 var porImg = $('#biuuu'),//首先获取大图片jquery对象
    04 viewImg = $('#view');//小图片jquery对象
    05 //判断该浏览器是否为w3c标准,既非IE浏览器
    06 if (file["files"] && file["files"][0])
    07 {
    08 //使用JavaScript的FileReader对象来读取本地数据,并且将数据结果赋值给image的src,具体该对象如何实现的还未深入研究
    09 var reader = newFileReader();
    10 reader.onload =function(evt){
    11 porImg.attr({src :evt.target.result});
    12 viewImg.attr({src: evt.target.result});
    13 }
    14 reader.readAsDataURL(file.files[0]);
    15 }
    16  
    17 function previewImage(file)
    18 {
    19 var porImg = $('#biuuu'),//首先获取大图片jquery对象
    20 viewImg = $('#view');//小图片jquery对象
    21 //判断该浏览器是否为w3c标准,既非IE浏览器
    22 if (file["files"] && file["files"][0])
    23 {
    24 //使用JavaScript的FileReader对象来读取本地数据,并且将数据结果赋值给image的src,具体该对象如何实现的还未深入研究
    25 var reader = newFileReader();
    26 reader.onload =function(evt){
    27 porImg.attr({src :evt.target.result});
    28 viewImg.attr({src: evt.target.result});
    29 }
    30 reader.readAsDataURL(file.files[0]);
    31 }
    32 //如果是IE浏览器,采用滤镜效果,进行显示,但特别注意的是该滤镜效果使用的对象是div对象,并非img对象,因此我们需要将原有的img对象remove同时生成新的div对象,并且赋值相应的class和id
    33 else
    34 {
    35 //创建需要滤镜显示的div的dom对象
    36 var ieImageDom =document.createElement("div");
    37 var proIeImageDom =document.createElement("div");
    38 //设置对象的css属性和原有的img对象属性相同,添加相应的id属性值
    39 $(ieImageDom).css({
    40 float: 'left',
    41 position:'relative',
    42 overflow:'hidden',
    43  '100px',
    44 height: '100px'
    45 }).attr({"id":"view"});
    46 $(proIeImageDom).attr({"id":"biuuu"});
    47 //删除原有img对象,append创建div的dom对象
    48 porImg.parent().prepend(proIeImageDom);
    49 porImg.remove();
    50 viewImg.parent().append(ieImageDom);
    51 viewImg.remove();
    52 //采用滤镜效果生成图片预览
    53 file.select();
    54 path =document.selection.createRange().text;
    55 $(ieImageDom).css({"filter":"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=""+ path + "")"});
    56 $(proIeImageDom).css({"filter":"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=""+ path + "")"});
    57 // .style.filter ="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=""+ path + "")";//使用滤镜效果
    58 }



    这样就可以实现一个图片的在线编辑以及上传在预览功能。

    要注意,代码必须要使用客户端访问,例如:http://loacalhost/imgpreview/index.html,不要直接点击index.html访问

    代码下载

    转自:http://blog.csdn.net/danhuang2012/article/details/7703606

  • 相关阅读:
    要想成为前端大神,那些你不得不知晓的web前端命名规范。
    正确开启Mockjs的三种姿势:入门参考(一)
    1024码农节-向自己致敬!
    ES6 常用总结(前端开发js技术进阶提升总结)
    JS快速构建数组方法
    React绑定事件动态化的实现方法
    JQ遇到$(‘.xxx’).attr(‘display’)一直返回undefined
    你所要掌握的最简单基础的React渲染优化
    MyBatis Generator
    Spring boot集成redis初体验
  • 原文地址:https://www.cnblogs.com/xyzhuzhou/p/3443673.html
Copyright © 2020-2023  润新知