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 相关文章推荐
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
Bootstrap前端开发案例一
Jun 17 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
node.js调用C++函数的方法示例
Sep 21 Javascript
Vue源码解析之数据响应系统的使用
Apr 24 Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
js判断非127开头的IP地址的实例代码
Jan 05 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制作的意见反馈表源码
2007/03/11 PHP
php中的观察者模式简单实例
2015/01/20 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP数组函数知识汇总
2016/05/12 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
独特的python循环语句
2016/11/20 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
Python底层封装实现方法详解
2020/01/22 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
编辑硕士自荐信范文
2013/11/27 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
追悼会子女答谢词
2014/01/28 职场文书
特此通知格式
2015/04/27 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书