1. 程式人生 > >pc端通過拖放實現新增、刪除功能

pc端通過拖放實現新增、刪除功能

話不多說上完整程式碼

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<link href="favicon.ico" mce_href="favicon.ico" rel="shortcut icon bookmark" type="image/x-icon" />
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title>通過拖放實現新增、刪除 </title>
		<style type="text/css">
			.container{
				padding: 10px;
				box-sizing: border-box;
			}
			.container .mainclassify {
				color: #333333;
			}
			.container .mainclassify .title{
				line-height: 44px;
			}
			.container .mainclassify .title span{
				color: #CCCCCC;
				margin-left: 10px;
			}
			.container .mainclassify .listgroup-item {
			    background-color: none;
			    border: none;
			    overflow: hidden;
			}
			.container .mainclassify .listgroup-item li{
			    float: left;
			    width: 25%;
			    height: auto;
			}
			.container .mainclassify .listgroup-item .item_list{
			    /*background-color:;*/
			    width: 90%;
			    height: 70px;
			    margin: 5px auto;
			    padding: 5px;
			    box-sizing: border-box;
			    font-size: 12px;
			    color: #333;
			    border-radius: 5px;
			    background: #fff;
			}
		</style>
	</head>

	<body>
		<main class="container">
			<div class="mainclassify">
				<p class="fz14 title">我的分類</p>
				<ul class="listgroup-item">
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦1</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦2</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦3</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦4</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦5</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦6</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦7</div></li>
					<li draggable="true" ondragstart="dsHandler(event)"><div class="item_list">推薦8</div></li>
				</ul>
				<div style="border: 1px solid;width: 100%;height: 100px;" id="dest">
					<p ondragleave="return false">書藏家</p>
				</div>
				<img src="../images/garbagebin.png" id="gb" draggable="false"/>
			</div>
		</main>

		
		<script type="text/javascript">
			var dest = document.getElementById("dest");
			//拖動的時間監聽
			var dsHandler = function(evt){
				//將被拖動的元素的innerHTML屬性設定成被拖動的資料
				evt.dataTransfer.setData("text/plain","<item>"+evt.target.innerHTML);
			};
			dest.ondrop = function(evt){
				evt.preventDefault();
				var text = evt.dataTransfer.getData('text/plain');
				// 如果該text以<item>開頭
				if (text.indexOf("<item>") == 0)
				{
					// 建立一個新的div元素
					var newEle = document.createElement("div");
					// 以當前時間為該元素生成一個唯一的ID
					newEle.id = new Date().getUTCMilliseconds();
					// 該元素內容為“拖”過來的資料
					newEle.innerHTML = text.substring(6);
					// 設定該元素允許拖動
					newEle.draggable="true";
					// 為該元素的開始拖動事件指定監聽器
					newEle.ondragstart = function(evt)
					{
						// 將被拖動元素的id屬性值設定成被拖動的資料
						evt.dataTransfer.setData("text/plain"
							, "<remove>" + newEle.id);
					}
					dest.appendChild(newEle);
				}
			};
			// 當把被拖動元素“放”到垃圾桶上時激發該方法。
			document.getElementById("gb").ondrop = function(evt)
			{
				var id = evt.dataTransfer.getData("text/plain");
				// 如果id以<remove>開頭
				if (id.indexOf("<remove>") == 0)
				{
					// 根據“拖”過來的資料,獲取被拖動的元素
					var target = document.getElementById(id.substring(8));
					// 刪除被拖動的元素
					dest.removeChild(target);
				}
			}
			document.ondragover = function(evt)
			{
				// 取消事件的預設行為
				return false;
			}
			document.ondrop = function(evt)
			{
				// 取消事件的預設行為
				return false;
			}
	
		</script>
	</body>

</html>

其實,拖放刪除和新增這個功能最關鍵的地方就是“攜帶資料”。正是因為利用了DataTransfer物件來攜帶資料,才可以像剛才那樣新增和刪除。

下面是攜帶資料的基本思路:

“拖”開始的時候(‘拖’通過ondragstart事件監聽器來實現,上面的程式碼有詳細註釋喲),程式把需要攜帶的資料放入DataTransfer物件中。 “放”下元素的時候(通過ondrop事件監聽器來實現),程式從DataTransfer物件中取出資料,並利用該資料進行相應的處理。上邊的程式就為兩種拖放資料分別添加了<item>、<remove>,分別代表需要新增收藏夾的資料和需要刪除的資料。  好啦,以上就是通過拖動元素來新增和刪除的功能實現。由此可見,通過DataTransfer物件,我們可以讓拖放操作實現更豐富的功能。畢竟,DataTransfer物件的屬性和方法那麼多,想怎麼搭配都可以~

好啦,如果大家有什麼疑問,或者發現文章中有什麼錯誤,歡迎大家留言評論呀,我們一起學習咯~