购物车的拖放事件

目录

 

一、首先,要看有关的文

二、然后是布局,写好css的样式

三、最后编写js脚本,解释都在文件中。


一、首先,要看有关的文档

HTML5中的文件与拖放

1.掌握files对象

2. FileReader对象的使用方法

3.FileReader对象事件

4.掌握HTML5新增拖拽的api

5.掌握dataTransfer的使用方法

       在HTML5中,从Web网页上访问本地文件系统非常简单,那就是使用它新增的API,files对象。

       一)    files对象的使用方法

属性

描述

name

文件名称

size

文件大小

type

文件类型

注意:用户每个选择的文件都是一个files对象,而fileList对象则为这些files对象的列表,代表用户选择的所有文件。   

练习1:打印出上传文件的详细信息

练习2:进行上传文件后缀判断

       二)    FileReader接口读取文件

       FileReader接口主要用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步的api,使用该api可以在浏览器主线程中异步访问文件系统,读取文件中的数据。

方法

参数

描述

readAsDataUrl

file

将文件读取为DataURL

readAsText

file

将文件读取为文本

2.1:readAsDataUrl:该方法将文件读取为一段以data开头的字符串,这段字符串实际上是dataURL.,并且读取结果都将存储在result属性中。

2.2:readAsText该方法会读取文件中的文本元素,并且读取结果都将存储在result属性中。

注意:使用FileReader的时候,必须使用new运算符,创建出对象,并且调用readAsDaraUrl方法读取文件,在实例的onload事件中,获取到成功读取到的文件内容。

练习3:使用readAsDataUrl预览图片 

思考题;如何实现多个图片预览上传?

练习4:使用readAsText读取文本文件

  • FileReader事件

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

事件

描述

onabort

中断时触发

onerror

出错时触发

onload

文件读取成功完成时触发

onloadstart

读取完成触发,无论成功或失败

onloadend

读取时触发

onprogress

读取中(接受事件对象)

       练习5ajax异步上传文件(带进度条)

注意:文件上传是属于数据流的格式,那么我们就要注意,就要使用HTML5中的FormData对象

FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。

jquery中ajax方法,用法如下:

var fd = new FormData(document.querySelector("form"));

fd.append("CustomField", "This is some extra data");

$.ajax({

  url: "stash.php",

  type: "POST",

  data: fd,

  processData: false,  // 不处理数据

  contentType: false   // 不设置内容类型

)}

 

四)    常见的拖放api

       在HTL5中,支持直接拖放操作的api。虽然HTML5之前已经可以使用mousedown,mousemove和mouseup来进行操作,但只支持在浏览器内部的拖放;而在HTML5中,已经支持在浏览器与其它应用程序之间的数据互相拖动。

实现拖拽的步骤

  1. 把需要拖放的对象元素的draggable属性设为true(draggable=true)。这样才能将该元素进行拖放。
  2. 编写与拖放有关的事件处理代码。

拖拽api

 

拖拽元素API

  1. ondragstart:开始拖拽时触发
  2. Ondrag:拖拽中触发事件
  3. Ondragend:拖拽结束触发事件

目标元素API:

  1. ondragenter:进入目标元素时触发
  2. Ondragover:在目标元素时触发
  3. Ondragleave:离开目标元素时触发
  4. Ondrop:在目标元素上释放触发

注意:使用ondrop事件,必须要在ondragover中阻止默认事件。(e.preventDefault()

  •  dataTransfer对象用法

拖拽过程中,一定伴随着一个datatransfer对象,这个是新增的事件对象。

Datatransfer有两个重要的方法:

  1. setData(key,value):设置数据
  2. getData(key):获取数据     

练习7:利用datatransfer中的setData()和getData()设置和获取文本

练习8:利用 datatransfer实现文本(txt)预览

练习9:利用datatranster实现单张图片预览

练习10:利用datatranster实现多张图片预览

练习11:利用拖拽api和datatranster实现购物车结算

五)    总结

主要介绍了文件api和拖放api。在文件api中主要介绍了fileList对象与file对象,以及FileReader接口。通过这些文件的对象和接口,可以实现文件上传与文件预览等操作。介绍了dataTransfer对象的属性与方法的介绍,通过使用文件的api与拖放API,对于web页面上访问本地文件系统的相关操作,将会变得很简单。

 

二、然后创建THML,布局,写好css的样式

<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			*{margin: 0;padding: 0;}
			ul li{
				list-style: none;
			}
			.list{
				width: 880px;
				height: 300px;
				border: 1px solid #ddd;
				margin: 0 auto;
				margin-bottom: 10px;
			}
			.list ul li{
				width: 200px;
				height: 240px;
				float: left;
				margin: 10px;
			}
			.list ul li img{
				width: 200px;
				height: 240px;
			}
			.view{
				width: 880px;
				margin: 0 auto;
				border: 1px solid #ddd;
				min-height: 300px;
				position: relative;
			}
			.view span{
				float: left;
				width: 293px;
				height: 40px;
				border-bottom: 1px solid #ddd;
				text-align: center;
				line-height: 40px;
			}
			.view .allMoney{
				position: absolute;
				width: 100%;
				height: 20px;
				left: 0;
				bottom: 0;
				text-align: right;
			}
		</style>
	</head>
	<script type="text/javascript" src="js/2.js" ></script>
	<body>
		
		<div class="list" id="list">
			<ul>
				<li draggable="true">
					<img src="img/1.jpg" />
					<p>javascript精粹</p>
					<p>140</p>
				</li>
				<li draggable="true">
					<img src="img/2.jpg" />
					<p>javascript权威指南</p>
					<p>240</p>
				</li>
				<li draggable="true">
					<img src="img/3.jpg" />
					<p>javascriptDom艺术</p>
					<p>340</p>
				</li>
				<li draggable="true">
					<img src="img/4.jpg" />
					<p>javascript红皮书</p>
					<p>40</p>
				</li>
			</ul>
			
		</div>
		
		<div class="view" id="view">
			<!--<span class="num">1</span>
			<span class="title">javascript精粹</span>
			<span class="money">40</span>
			
			<div class="allMoney">
				40
			</div>-->
			
		</div>

三、最后编写js脚本,解释都在文件中。

<script>
			var oList = document.getElementById("list")
			var oLi = oList.getElementsByTagName("li")
			var oView = document.getElementById("view")
			var obj = {}//布尔值为真
			var sum = 0
			var oDiv = null//布尔值为假
			
			//给每个li被拖拽的事件
			for (var i=0;i<oLi.length;i++) {
				oLi[i].ondragstart = function(e){
					var oP = this.getElementsByTagName("p")//获取到li下面的p节点
					//利用dataTransfer这个事件对象来设置和获取数据
					e.dataTransfer.setData("sTitle",oP[0].innerHTML)//通过setData的方法来设置数据
					e.dataTransfer.setData("sMoney",oP[1].innerHTML)
				}
			}
			
			//一定要阻止默认事件
			oView.ondragover = function(e){
				e.preventDefault()//阻止默认行为
			}
			
			oView.ondrop = function(e){
				e.preventDefault()//阻止默认行为
				var oTitle = e.dataTransfer.getData("sTitle")//通过getData的方法接收数据缓存到oTitle中
				var oMoney = e.dataTransfer.getData("sMoney")
				
				//创建一个空的对象来做判断条件
				if(!obj[oTitle]){
					//通过盘对条件来相对应的添加节点和数据
					var oSpan = document.createElement("span")
					oSpan.className = "num"//设置节点的属性
					oSpan.innerHTML = 1//给节点的文本赋值
					oView.appendChild(oSpan)//将节点添加到oView节点的下面
					
					var oSpan = document.createElement("span")
					oSpan.className = "title"
					oSpan.innerHTML = oTitle
					oView.appendChild(oSpan)
					
					var oSpan = document.createElement("span")
					oSpan.className = "money"
					oSpan.innerHTML = oMoney
					oView.appendChild(oSpan)
					
					obj[oTitle] = 1
					
				}else {
//					alert(2)
					var allNum = document.getElementsByClassName("num")//获取到每个属性为num的节点
					var allTitle = document.getElementsByClassName("title")//获取到每个属性为title的节点
					//for循环每个节点
					for (var i=0;i<allNum.length;i++) {
						//如果每个allTitle节点的innerTHML跟原来的oTitle的innerTHML相同,allNum节点的IinnerHTML就+1
						if(allTitle[i].innerHTML == oTitle){
							allNum[i].innerHTML = parseInt(allNum[i].innerHTML)+1
						}
					}
				}
				
				//同理上面的判断条件,如果这个oDiv对象不存在就在oView节点下面添加oDiv节点,否则就将oMoney的number追加到oDiv的innerHTML
				if(!oDiv){
					 oDiv = document.createElement("div")
					oDiv.className = "allMoney"
					oView.appendChild(oDiv)//添加节点
				}
//				console.log(oMoney)
				sum+=parseFloat(oMoney)//追加数据
				
				oDiv.innerHTML = "总计"+sum+"元"//赋值
				
				
			}
			
			
			
			
		</script>

猜你喜欢

转载自blog.csdn.net/qq_42158442/article/details/82702958