JavaScript实现图片本地预览功能【不用上传至服务器】


Posted in Javascript onSeptember 20, 2017

本文实例讲述了JavaScript实现图片本地预览功能。分享给大家供大家参考,具体如下:

实现一个在file文件域中选定图片文件之后,马上进行预览。不用预上传到服务器,整缩略图再打回前端用Ajax去预览的。直接利用JavaScript即可以完成,而且还可以兼容IE6。具体效果,如下图所示:

JavaScript实现图片本地预览功能【不用上传至服务器】

具体实现是在非IE浏览器利用HTML5去显示,在IE浏览器则直接调用IE的滤镜功能去实现。具体代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>图片上传本地预览</title>
    <style type="text/css">
      /*设置IE滤镜,这里的id=imghead要与下方利用Javascript生成div的id相呼应。*/
      #imghead {filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);}
    </style>
    <script type="text/javascript">
      //图片上传预览,非IE则用了HTML5的代码,IE是用了滤镜
      function previewImage(file, MAXWIDTH, MAXHEIGHT){//MAXWIDTH、MAXHEIGHT与放预览图片的DIV——preview的大小相呼应
        var div = document.getElementById('preview');
        if (file.files && file.files[0]) {//HTML5部分
          div.innerHTML = "<img id='imghead'></img>";
          var img = document.getElementById('imghead');
          img.onload = function(){
            var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);
            img.width = rect.width;
            img.height = rect.height;
            img.style.marginTop = rect.top + 'px';
          }
          var reader = new FileReader();
          reader.onload = function(evt){
            img.src = evt.target.result;
          }
          reader.readAsDataURL(file.files[0]);
        }
        else //兼容IE
        {
          var sFilter = 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="';
          file.select();
          var src = document.selection.createRange().text;
          div.innerHTML = "<img id='imghead'></img>";
          var img = document.getElementById('imghead');
          img.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;
          var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);
          div.innerHTML = "<div style='width:" + rect.width + "px;height:" + rect.height + "px;margin-top:" + rect.top + "px;" + sFilter + src + "\"'></div>";
        }
      }
      //用于计算预览图片的大小
      function clacImgZoomParam(maxWidth, maxHeight, width, height){
        var param = {
          top: 0,
          left: 0,
          width: width,
          height: height
        };
        if (width > maxWidth || height > maxHeight) {
          rateWidth = width / maxWidth;
          rateHeight = height / maxHeight;
          if (rateWidth > rateHeight) {
            param.width = maxWidth;
            param.height = Math.round(height / rateWidth);
          }
          else {
            param.width = Math.round(width / rateHeight);
            param.height = maxHeight;
          }
        }
        param.left = Math.round((maxWidth - param.width) / 2);
        param.top = Math.round((maxHeight - param.height) / 2);
        return param;
      }
    </script>
  </head>
  <body>
    <div id="preview" style="width:320px;height:240px;"></div><!--用来放预览图片的DIV-->
    <input type="file" onchange="previewImage(this,320,240)" accept="image/*" /><!--一旦用户选择了图片文件,则触发上方的previewImage函数-->
  </body>
</html>

首先在preview这个放图片预览的div中生成一个id=imghead的div。

非IE部分,用HTML5直接可以读取用户选择的文件,通过function clacImgZoomParam(maxWidth, maxHeight, width, height)计算出预览图片的大小,之后直接可以将这张图片放到id=imghead这个div中。如果是IE,生成的id=imghead的div会被赋予在style标签设置好的滤镜,通过滤镜将用户选择的图片文件加载上去,再用clacImgZoomParam函数求其大小,得到大小之后,清除preview中的所有内容,正式生成被赋予图片滤镜,其大小确定的div上去。

<input type="file">文件域也用到accept="image/*"这个HTML5功能用来限制用户只能选择图片文件,但是,在提交表单的时候,还应该通过onSubmit判断,同时更应该在服务器后台判断,防止用户送些奇奇怪怪的东西到服务器。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS实现self的resend
Jul 22 Javascript
JavaScript中字面量与函数的基本使用知识
Oct 20 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
angular双向绑定模拟探索
Dec 26 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
Vue中添加手机验证码组件功能操作方法
Dec 07 Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
vue中nextTick用法实例
Sep 11 Javascript
jQuery实现手风琴效果(蒙版)
Jan 11 jQuery
浅谈vue中$bus的使用和涉及到的问题
Jul 28 Javascript
Vue之封装公用变量以及实现方式
Jul 31 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 #Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 #jQuery
微信小程序授权获取用户详细信息openid的实例详解
Sep 20 #Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 #jQuery
Vue-cli创建项目从单页面到多页面的方法
Sep 20 #Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
Sep 20 #Javascript
vue学习笔记之v-if和v-show的区别
Sep 20 #Javascript
You might like
PHP 数字左侧自动补0
2008/03/31 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
使用JS 清空File控件的路径值
2013/07/08 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python开发之str.format()用法实例分析
2016/02/22 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Python 中@property的用法详解
2020/01/15 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
教师职称自我鉴定
2014/02/12 职场文书
《猫》教学反思
2014/02/26 职场文书
实习生评语
2014/04/26 职场文书
写字楼租赁意向书
2014/07/30 职场文书
英语投诉信范文
2015/07/03 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python