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 相关文章推荐
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
jQuery中delegate与on的用法与区别示例介绍
Dec 20 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
javascript模拟命名空间
Apr 17 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
浅谈JS中的常用选择器及属性、方法的调用
Jul 28 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
React中如何引入Angular组件详解
Aug 09 Javascript
ElementUI中el-tree节点的操作的实现
Feb 27 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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 mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
html下载本地
2006/06/19 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python文件操作基本流程代码实例
2017/12/11 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
pycharm设置注释颜色的方法
2018/05/23 Python
Python如何发布程序的详细教程
2018/10/09 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
太太口服液广告词
2014/03/20 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
幼儿教师求职信
2014/05/24 职场文书
护士自我推荐信范文
2015/03/24 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript