1. 程式人生 > >購物車的拖放事件

購物車的拖放事件

目錄

 

一、首先,要看有關的文

二、然後是佈局,寫好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>