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 相关文章推荐
自适应高度框架 ----属个人收藏内容
Jan 22 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
AngularJS中$http的交互问题
Mar 29 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
Apr 17 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
小程序实现留言板
Nov 02 Javascript
Vue程序调试的方法
Jun 17 Javascript
vue.js购物车添加商品组件的方法
Sep 17 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
php 强制下载文件实现代码
2013/10/28 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
JQuery基础语法小结
2015/02/27 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
差生评语大全
2014/05/04 职场文书
财务部岗位职责
2015/02/03 职场文书
2016年寒假见闻
2015/10/10 职场文书
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS