html5 查看图片,html5实现图片预览和查看原图

一、页面元素只有三个简单元素:

拖拽区域

二、添加简单的样式:

.dragarea{

width:300px;

height:100px;

background:#ddd;

text-align:center;

line-height:100px;

}

.drag_hover{

background:rgba(0,0,0,.4) !important;

}

.item{

width:300px;

height:100px;

float:left;

margin-right:30px;

margin-bottom:50px;

}

.item > img{

height:auto;

width:100%;

}

.big{

position: fixed;

top: 100px;

left: 0px;

}

页面的样子:

00d1bf300cee46681b9a14ea7c6cc953.png

三、javascript的编写:

var Upload = (function(){

var upimg = document.getElementById("upimg");

var dragimg = document.getElementById("dragimg");

var showimg = document.getElementById("showimg");

function init(){

if(!(window.FileReader && window.File

&& window.FileList && window.Blob)){

showimg.innerHTML="您的浏览器不支持FileReader";

return false;

}

handler();

}

function handler(){

upimg.addEventListener("change",function(e){

var files = this.files;

if(files.length){

checkFiles(files);

}

});

dragimg.addEventListener("dragenter",function(e){

this.className += " drag_hover";

},false);

dragimg.addEventListener("dragleave",function(e){

this.className = "dragarea";

},false);

dragimg.addEventListener("drop",function(e){

var files = e.dataTransfer.files;

this.className = "dragarea";

if(files.length !=0){

checkFiles(files);

}

e.preventDefault();//阻止事件默认动作的执行

},false);

dragimg.addEventListener("dragover",function(e){

e.dataTransfer.dropEffect = "copy";

e.preventDefault();

},false);

showimg.addEventListener("click",function(e){

var target = e.target;

if(target.tagName.toUpperCase() == "IMG"){

var parent = target.parentNode;

var items = this.childNodes;

var big = parent.className.indexOf("big") >0;

for(var i=0;i

items[i].className = "item";

items[i].firstElementChild.style.cssText="";

}

if(!big){

target.style.cssText="width:"+target.naturalWidth+"px;height:"+target.naturalHeight+"px";

parent.className +=" big";

}

}

},false);

}

function checkFiles(files){

if(files.length != 0){

var html = "";

var i=0,j=showimg.childElementCount;

var func = function(){

if(files[i]){

var x = parseInt((i+j)/4)*50;

var reader = new FileReader();

if(!/image\/\w+/.test(files[i].type)){

showimg = "请确保为图像类型";

return false;

}

reader.onload = function(e){

html += '

'+e.target.result+'
';

i++;

func();

}

reader.readAsDataURL(files[i]);

}else{

showimg.innerHTML +=html;

}

}

func();

}

}

return {

init:init

}

})();

Upload.init();

四、说明学习过程中重点理解的几点:

1、这里的javascript的整体结构为:

var xxx=(function(){

function init(){...}

return {

init:init

}

})();

xxx.init();

定义了xxx对象,并用init()方法作为执行对象方法的入口。xxx就有点像java中的类,init()就像这个类的构造方法。xxx对象是一个Function,并用小括号括起来是为了将这个Function视为一个表达式,后面又紧跟一个小括号代表函数立即执行。

注意:在全局调用了init()方法,而该方法是在一个函数中的,要知道全局无法访问函数内部的变量或者方法,所以这里将init方法return,全局才可以访问。

另外两种写法:

使用this关键字

var xxx=function(){

this.init = function(){..}

};

var exmple = new xxx;

exmple.init();

闭包

var xxx=function(){

var init = function(){...}

return init;

}

var init = xxx();

init();

这里调用的时候写成var xxx= new xxx;效果是一样的。

2、addEventListener方法第三个参数,代表事件的捕获和冒泡。

true:事件捕获,事件从最不精确的对象(document 对象)开始触发,然后到最精确,顺序document——>body——>div——>目标元素;

false:事件冒泡,事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发,和上面的顺序相反。

3、拖拽事件:

dragdrop:拖放完成,也就是鼠标拖入对象并在拖放区域释放。

dragenter:拖放进入,也就是鼠标拖放对象进入拖放区域。

dragleave:离开拖放区域。

dragover:拖放对象悬浮于拖放区域,在拖放区域内移动时多次触发。

这个例子中我只在dragenter和dragleave事件中做了背景颜色的切换。

dragover中有个dataTransfer,对其的介绍:

DataTransfer

拖拽数据传递对象,一般使用方式event.dataTransfer。

dataTransfer.dropEffect[ =value]

拖拽效果,可选值:“none”, “copy”, “copyLink”, “copyMove”, “link”, “linkMove”, “move”, “all”, and “uninitialized”。

dataTransfer.items

拖拽的数据集合,是一个数组。

dataTransfer.setDragImage(element,x,y)

Uses the given element to update the drag feedback, replacing any previously specified feedback.

英文有点拗口,就是拖拽过程中定义一个元素替换原有的,可以看到拖拽元素跟随的效果。

dataTransfer.addElement(element)

Adds the given element to the list of elements used to render the drag feedback.

dataTransfer.types

Returns a DOMStringList listing the formats that were set in the dragstart event. In addition, if any files are being dragged, then one of the types will be the string “Files”.

data=dataTransfer.getData(format)

Returns the specified data. If there is no such data, returns the empty string.

获取自定义的数据格式,如ev.dataTransfer.getData("text");通常是配合ev.dataTransfer.setData使用。

dataTransfer.setData(format,data)

Adds the specified data.

添加自定义数据格式,如ev.dataTransfer.setData("text", ev.target.innerHTML);有点像jquery里面的data

dataTransfer.clearData( [format] )

Removes the data of the specified formats. Removes all data if the argument is omitted.

清除自定义的数据格式及其数据。

dataTransfer.files

Returns a FileList of the files being dragged, if any.

拖拽的文件列表对象。

那么drop事件中的e.dataTransfer.files也不难理解了。

4、事件的preventDefault()方法:

该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。

5、javascript的style.cssText:

可以像jquery中的css()方法一样用一行代码添加多种样式,只是会覆盖之前的样式,所以在使用cssText的时候可以这样写 obj.style.cssText +="width:30px;height:40px";用加号添加样式。

6、正则表达式/image\/\w+/.test():

test()方法:

该方法的返回值是布尔值,通过该值可以匹配字符串中是否存在于正则表达式相匹配的结果,如果有匹配内容,返回ture,如果没有匹配内容返回false,该方法常用于判断用户输入数据的合法性,比如检验Email的合法性

/image\/\w+/的解释:

/正则内容/ 是一种正则的写法

imge\/\w+

\/表示 /

\w+ 表示一个或多个字母数字下划线

+表示一个多个

7、FileReader

用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据。到目前文职,只有FF3.6+和Chrome6.0+实现了FileReader接口。

1、FileReader接口的方法

FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

FileReader接口的方法

方法名

参数

描述

readAsBinaryString

file

将文件读取为二进制编码

readAsText

file,[encoding]

将文件读取为文本

readAsDataURL

file

将文件读取为DataURL

abort

(none)

终端读取操作

2、FileReader接口事件

FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。

FileReader接口的事件

事件

描述

onabort

中断

onerror

出错

onloadstart

开始

onprogress

正在读取

onload

成功读取

onloadend

读取完成,无论成功失败

在这个例子中 reader.readAsDataURL(files[i])触发了onload方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五大板块(4)——链表

参考:五大板块(4)——链表 作者:丶PURSUING 发布时间: 2021-02-15 09:33:29 网址:https://blog.csdn.net/weixin_44742824/article/details/114981905 目录一、对比链表与数组同样是存放一串数据&#xff0…

boolean类型默认值_「软帝学院」Java的基本数据类型

Java的基本数据类型Java的两大数据类型: 内置数据类型 引用数据类型内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。byte: byte数据类型是8位、有符号的&#xff0c…

五大板块(5)——字符串

参考:五大板块(5)——字符串 作者:丶PURSUING 发布时间: 2021-03-18 16:03:48 网址:https://blog.csdn.net/weixin_44742824/article/details/114982019 目录一、字符串的定义方式与输出二、字符串的结尾是…

哈尔滨阳光计算机学院是不是黄了,黑龙江这4所野鸡大学,常被误认为是名校,实则害人不浅...

在高考中拿到高分进入心仪的大学,几乎是所有高三党奋斗努力的目标。但并不是所有的考生都能得偿所愿,没有取得高分,想进入好大学,但是又不想复读再经历一次高三的磨砺。如果此时你收到了录取通知书或者电话,告知你被一…

android 打开支付宝扫码页_Chrome 85正式版发布:新增标签页分组功,网页多了也不乱...

IT服务圈儿有温度、有态度的IT自媒体平台文章转载自 OSCHINA 社区[http://www.oschina.net]原文标题:Chrome 85 稳定版发布,页面加载速度提升 10%谷歌今日发布了最新稳定版 Chrome 85。此版本将页面加载速度提高了 10%,并带来了许多标签页方面…

Windows使用技巧

摘自:这些技巧让你windows用起来很爽 —— 小工具,小技巧,删小广告,重装卸载残留 作者:丶PURSUING 发布时间: 2021-03-12 16:09:17 网址:https://blog.csdn.net/weixin_44742824/article/detail…

iOS开发缓存机制之—内存缓存机制

在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制。这篇文章将介绍一下如何在iOS设备中进行缓存,本文先介绍一下将内容缓存到内存中,下一篇文章就介绍一下在i…

云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...

云和县实验小学计算机教室综合布线及计算机安装预算方案.doc (2页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!17.90 积分云和县教育装备和勤工俭学办公室计算机教室改造工程参数设备名…

循环造数据_项目管理数据与信息--DIKW模型

开头的话在PMP中,有一块内容是“项目管理数据与信息:工作绩效数据(Work Performance Data),工作绩效信息(Work Performance Information),工作绩效报告(Work Performance…

基于C语言Ncurse库和链表的简单贪吃蛇小游戏

参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44234294/article/details/108829135?spm1001.2014.3001.5501 Ncurses库相关介绍 ncurse…

C 内存分配【转】

c 内存分配 1、程序代码区:存放函数体的二进制代码。 2、全局区数据区:全局数据区划分为三个区域。 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数…

STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

摘自:STM32F103五分钟入门系列(一)跑马灯(库函数寄存器)加编程模板GPIO总结 作者:自信且爱笑‘ 发布时间: 2021-04-28 21:17:40 网址:https://blog.csdn.net/Curnane0_0/article/det…

计算机没有程序,计算机小知识:想尝试写程序却没有电脑?这个在线编辑器满足你...

大家好,我是零一,昨天的文章《计算机小知识:手把手教你写出自己的第一个程序:Hello World》发表后,没几分钟就有小伙伴问我,没有电脑,但是真的很想尝试去学习一下编程,应该怎么办&am…

微信小程序时间戳的转换及调用

13位 的时间戳,如下图: 效果图: 1.(utils.js里面的代码): function formatTime(timestamp, format) {const formateArr [Y, M, D, h, m, s];let returnArr [];let date new Date(timestamp); //13位的时间戳, 如果不是13位的, 就要乘1000,就像这样…

基于Wemos D1的感应开盖垃圾桶

参考:基于Wemos D1的感应开盖垃圾桶(增加自己的代码实现部分) 作者:LEO-max 发布时间:2020-12-29 15:21:26 网址:https://blog.csdn.net/zouchengzhi1021/article/details/111880104?spm1001.2014.3001.55…

电脑计算机主板不启动,电脑主板不能启动的解决方法

电脑主板不能启动的解决方法主板又称主机板、系统板、逻辑板、母板、底板等,是构成复杂电子系统例如电子计算机的中心或者主电路板。下面给大家介绍电脑主板不能启动的解决方法,欢迎阅读!电脑主板不能启动的解决方法电脑主板不能启动的解决方法一&#x…

WEB前端 CSS(非布局)

目录 WEB前端 CSSCSS引入方式CSS结构CSS选择器直接选择器组合选择器分组选择器 也叫并集选择器属性选择器伪类选择器伪元素选择器CSS选择器是一个查找的过程,高效的查找影响页面加载的效率CSS选择器的优先级CSS声明CSS非布局声明CSS布局声明除了css 对样式有影响&am…

二叉树的三叉链表存储和基本操作

三叉链表存储表示 改进于二叉链表,增加指向父节点的指针,能更好地实现结点间的访问。 存储结构 /* 二叉树的三叉链表存储表示 */typedef struct BiTPNode{TElemType data;struct BiTPNode *parent,*lchild,*rchild; /* 双亲、左右孩子指针 */}BiTPNode,*…

麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式

做价值的传播者,一路同行,一起成长问题:怎样才能每天都收到这类文章!答案:只需点击上方《通达信公式指标》{通达信单阳不破}MA30: MA(C,30 ),COLORGREEN;MA30_: IF(MA30>REF(MA30,1),MA30,DRAWNULL),COLORMAGENTA;阳…

高考英语口语测试软件,练习英语口语的app有哪些

随着国际化的发展,英语越来越普遍。英语中口语也是很重要的成分之一。也是跟老外交流或者英语考试的重要考点之一。我们有很多方法锻炼口语。什么方法最快捷最有效方便?下面我们看看几款最受欢迎的英语口语练习app。练习口语的app1、口语侠一款非常实用的…