drag-and-drop实现图片浏览器预览


Posted in Javascript onAugust 06, 2015

今天刚试过chrome的drag and drop API,它能非常简单的将本地的图片放到浏览器中进行预览。试想一下当我们把一个文图片拖拽到浏览器里会发生什么事情,你的浏览器试图打开一个新的页面并加载这个图片。现在我不想浏览器这样帮我处理图片,我希望我拖拽的图片能立即放到我预先规定的位置并迅速回显,这就需要javascript中event对象的两个函数stopPropergation()和preventDefault()。前者将会阻止事件的冒泡,后者会阻止浏览器默认的行为。

这里我们定义一个ignoreDrag函数,用以实现上述功能:
Html代码 

var ignoreDrag = function(e){ 
     e.originalEvent.stopPropagation(); 
     e.originalEvent.preventDefault(); 
     }

然后利用jquery绑定事件
Html代码 

$('#drop') 
.bind('dragenter',dragenter) 
.bind('dragover',dragover) 
.bind('drop',drop);

这里最好用jquery去绑定事件,因为jquery帮我们把event对象做了很好的封装,这样我们才能毫无顾忌的使用stopPropagation和preventDefault函数。
同时定义dragover,dragenter事件函数

Html代码 

var dragover = function(e){ 
     ignoreDrag(e); 
   } 
   var dragenter = function(e){ 
     ignoreDrag(e); 
   }

这个一定要定义,否则仍然无法阻止浏览器的默认行为。

最后定义drop函数,也就是当我们把图片放到指定位置时触发的函数
Html代码 

var drop = function(e){ 
    ignoreDrag(e); 
    var dt = e.originalEvent.dataTransfer; 
    var files = dt.files; 
    var fr = new FileReader(); 
    fr.onload = function(e){ 
      var image = new Image(); 
      image.src = e.target.result; 
      $('#drop').append(image) 
    } 
    fr.readAsDataURL(files[0]); 
   }

这个函数是整个功能的关键,这里用到了html5的一些特性,dataTransfer和FileReader。
dataTransfer是drop事件的event参数的一个属性,它包含了droped文件的一些信息,通过dataTransfer的files属性可以获得文件的数组,数组中的元素就是droped文件对象,可以通过name,type,size分别获取文件的名字,类型和大小;文件的内容就要用FileReader来读取,FileReader对象的实例拥有4个方法,其中3个用以读取文件,另一个用来中断读取,下面这张表格列出了这些方法以及他们的功能,注意,不论读取成功与否,函数都不会返回读取的结果,结果存取在result属性中:

 readAsText: 该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。

readAsBinaryString: 它将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。

readAsDataURL: 这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URI,Data URI是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。

FileReader还包含一系列的事件模型,如下表所示: 

drag-and-drop实现图片浏览器预览

这里额外在介绍一下drag-and-drop的事件,表格如下:

 

回到正题,通过FileReader的readAsDataURL函数读取图片,同时在FileReader对象上定义onload函数,当图片加载完毕,通过event.target.result获取文件的base64编码的内容,上一个博客我已经讲过data类型的url可以直接写在img标签的src里面,浏览器就会解析,而不用从外部加载,通过这个特性,将获取到的图片内容赋给img标签的src,并将image对象添加到指定区域里,就可以实现所需的功能。

Html代码 

<html> 
 <head> 
 <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
  <style type="text/css"> 
   #drop{ 
    width:500px; 
    height:300px; 
    border:1px solid grey; 
    line-height:300px; 
    text-align:center; 
    overflow:auto; 
   } 
  </style> 
  <script type="text/javascript" src="jquery-1.7.1.min.js"></script> 
  <script type="text/javascript"> 
   var ignoreDrag = function(e){ 
     e.originalEvent.stopPropagation(); 
     e.originalEvent.preventDefault(); 
     } 
   var dragover = function(e){ 
     ignoreDrag(e); 
   } 
   var dragenter = function(e){ 
     ignoreDrag(e); 
   } 
   var drop = function(e){ 
    ignoreDrag(e); 
    var dt = e.originalEvent.dataTransfer; 
    var files = dt.files; 
    var fr = new FileReader(); 
    fr.onload = function(e){ 
      var image = new Image(); 
      image.src = e.target.result; 
      $('#drop').append(image) 
    } 
    fr.readAsDataURL(files[0]); 
   } 
   $( function(){ 
     $('#drop').bind('dragenter',dragenter).bind('dragover',dragover).bind('drop',drop); 
   }); 
  </script> 
 </head> 
 <body> 
  <div id="drop" > 
  请将图片放到这里! 
  </div> 
 </body> 
</html>

以上内容就是使用drag-and-drop实现图片浏览器预览的全部内容,希望大家喜欢。

Javascript 相关文章推荐
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
jQuery页面滚动浮动层智能定位实例代码
Aug 23 Javascript
使用js显示当前时间示例
Mar 02 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
Bootstrap实现翻页效果
Nov 27 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
JavaScript常见JSON操作实例分析
Aug 08 Javascript
微信小程序 textarea 层级过高问题简单解决方案
Oct 14 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
vue 实现element-ui中的加载中状态
Nov 11 Javascript
js简单实现标签云效果实例
Aug 06 #Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 #Javascript
JavaScript实现的圆形浮动标签云效果实例
Aug 06 #Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
Aug 06 #Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 #Javascript
js实现网页抽奖实例
Aug 05 #Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 #Javascript
You might like
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
PHP 图片文件上传实现代码
2010/12/29 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
Python验证企业工商注册码
2015/10/25 Python
python操作mysql代码总结
2018/06/01 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Django REST 异常处理详解
2020/07/15 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
Go标准容器之Ring的使用说明
2021/05/05 Golang
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
java实现面板之间切换功能
2022/06/10 Java/Android
canvas 中如何实现物体的框选
2022/08/05 Javascript