这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
chrome 的 drag and drop API,它能将本地的图片放到浏览器中进行预览,猜想一下当我们把图片拖拽到浏览器里会发生什么事情,你的浏览器试图打开一个新的页面并加载这个图片。这篇文章给我们介绍 drag-and-drop 实现图片浏览器预览,需要的朋友可以参考下
今天刚试过 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 的事件,表格如下:
回到正题,通过 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 实现图片浏览器预览的全部内容,希望大家喜欢。
来源: http://www.phperz.com/article/17/0724/270092.html