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 定义初始化数组函数
Sep 07 Javascript
window.location.hash 属性使用说明
Mar 20 Javascript
不同的jQuery API来处理不同的浏览器事件
Dec 09 Javascript
JavaScript的Module模式编程深入分析
Aug 13 Javascript
HTTP 304错误的详细讲解
Nov 13 Javascript
js实现文章文字大小字号功能完整实例
Nov 01 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
Apr 12 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
Vue如何提升首屏加载速度实例解析
Jun 25 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与XML的PDF文档生成技术
2006/10/09 PHP
PHP+DBM的同学录程序(2)
2006/10/09 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
初识Node.js
2014/09/03 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
python读写文件操作示例程序
2013/12/02 Python
python多线程操作实例
2014/11/21 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python代码实现KNN算法
2017/12/20 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
中科软测试工程师面试题
2012/06/16 面试题
软件测试企业面试试卷
2016/07/13 面试题
新闻专业推荐信范文
2013/11/20 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
英文求职信范文
2014/05/23 职场文书
入党函调证明材料
2014/12/24 职场文书
工程部部长岗位职责
2015/02/12 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android