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…

Quickly Find/ Open a file in Visual Studio

ctrl/, enter ">of " search item http://codeblog.shawson.co.uk/quickly-find-open-a-file-in-visual-studio/转载于:https://www.cnblogs.com/joe-yang/archive/2012/10/19/2731201.html

poj 3070

题面 大意就是求斐波那契数列第n项&#xff0c;做法为矩阵快速幂。 代码 #include<iostream> #include<cstdio> #include<cstring> #define LL long longusing namespace std; const int mod 10000; struct Mat{LL a[4][4];Mat(){memset(a,0,sizeof(a));}M…

计算机组装与维修预习,《计算机组装与维修》预习报告、实习报告撰写要求.docx...

《计算机组装与维修》预习报告、实习报告撰写要求本次《计算机组装与维修》课程的实验报告由两部分组成&#xff1a;预习报告和实习报告(总结)。其要求除了必须符合“《计算机组装与维修》课程考核标准及管理办法”外&#xff0c;强调要求预习报告要求每个参加实习的同学必须在…

Updating -- Linux小知识

没想到&#xff0c;10几年后又开始重拾这些曾经学习和使用过的知识&#xff0c;也许一切都是轮回&#xff0c;还好能捡起来。 1. 常用命令(参考 Linux 命令大全 | 菜鸟教程) #命令说明样例1whoami当前用户ID 2id当前用户ID 和 用户组IDid -un # 用户名 id -gn # 用户组…

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

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

潘多拉设置有线中继_避坑指南:购买无线中继器必看

房子太大&#xff0c;一台路由器容易覆盖不全&#xff0c;或者想蹭隔壁老王家的WiFi&#xff0c;这时候需要用到无线中继器。无线中继器主要作为无线路由器的补充产品&#xff0c;选得好就是锦上添花&#xff0c;选不好依旧是气到爆炸。所以&#xff0c;在购买无线中继器前&…

poj2154 Color ——Polya定理

题目&#xff1a;http://poj.org/problem?id2154 今天学了个高端的东西&#xff0c;Polya定理... 此题就是模板&#xff0c;然而还是写了好久好久... 具体看这个博客吧&#xff1a;https://blog.csdn.net/wsniyufang/article/details/6671122 代码如下&#xff1a; #include&l…

[转]sudoers设置

from http://www.cnblogs.com/zhuowei/archive/2009/04/13/1435190.htmlsudo与sudoerssudo 是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#xff0c;如halt&#xff0c;reboot&#xff0c;su等 等。这样…

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

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

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

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

Windows使用技巧

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

xunsearch安装使用

目录 1.下载2.进入&#xff0c;安装3.安装成功后&#xff0c;启动后台服务4.安装PHP-SDK安装步骤 1.下载 wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 tar -xjf xunsearch-full-latest.tar.bz2 2.进入&#xff0c;安装 cd xunsearch-full-1.4.11/ s…

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

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

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

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

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

开头的话在PMP中&#xff0c;有一块内容是“项目管理数据与信息&#xff1a;工作绩效数据&#xff08;Work Performance Data&#xff09;&#xff0c;工作绩效信息&#xff08;Work Performance Information&#xff09;&#xff0c;工作绩效报告&#xff08;Work Performance…

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

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

C 内存分配【转】

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

计算机中求某学校班级人数,计算机1级的计算题

计算题:1、现有一张某班级期末总成绩表(如上图)&#xff0c;其中平均分为数学、英语、计算机基础三门课程的平均值&#xff0c;实际分数由平均分与平时成绩按一定比率相加所得&#xff0c;其中平均分占实际分数的百分比写在D7单元格中&#xff0c;平时成绩占实际分数的百分比写…