欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

购物车的拖放事件

程序员文章站 2024-02-05 12:00:46
...

目录

 

一、首先,要看有关的文

二、然后是布局,写好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>

 

 

相关标签: 一脸懵逼