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 相关文章推荐
javascript 面向对象编程 万物皆对象
Sep 17 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
Apr 11 Javascript
常见JS效果之图片减速度滚动实现代码
Dec 08 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
Mar 06 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
Aug 21 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
详解如何使用nvm管理Node.js多版本
May 06 Javascript
微信小程序如何使用globalData的方法
Jun 06 Javascript
在vue中使用console.log无效的解决
Aug 09 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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
PHP中的串行化变量和序列化对象
2006/09/05 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
常用PHP框架功能对照表
2014/10/23 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
详解jQuery中的事件
2016/12/14 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
Node.js 多线程完全指南总结
2019/03/27 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
Python使用xpath实现图片爬取
2020/09/16 Python
python实现三壶谜题的示例详解
2020/11/02 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
青年志愿者活动总结
2014/04/26 职场文书
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android