天天看點

記一次h5拖放(Drag 和 drop)踩坑

定義和用法

ondrop 事件在可拖動元素或選取的文本放置在目标區域時觸發。

拖放是 HTML5 中非常常見的功能。 更多資訊可以檢視我們 HTML 教程中的 HTML5 拖放。

注意: 為了讓元素可拖動,需要使用 HTML5 draggable 屬性。

提示: 連結和圖檔預設是可拖動的,不需要 draggable 屬性。

在拖放的過程中會觸發以下事件:

  • 在拖動目标上觸發事件 (源元素):
    • ondragstart - 使用者開始拖動元素時觸發
    • ondrag - 元素正在拖動時觸發
    • ondragend - 使用者完成元素拖動後觸發
  • 釋放目标時觸發的事件:
    • ondragenter - 當被滑鼠拖動的對象進入其容器範圍内時觸發此事件
    • ondragover - 當某被拖動的對象在另一對象容器範圍内拖動時觸發此事件
    • ondragleave - 當被滑鼠拖動的對象離開其容器範圍内時觸發此事件
    • ondrop - 在一個拖動過程中,釋放滑鼠鍵時觸發此事件

上面的定義與用法來自 https://code.ziqiangxuetang.com/jsref/event-ondrop.html

下面代碼代碼是拖放的一個示例,其中藏的兩個注意點(本人遇到的坑)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			.container {
				width: 300px;
				height: 300px;
				background-color: #269ABC;
				margin-right: 40px;
				display: inline-block;
			}
			.block{
				width: 50px;
				height: 50px;
				background-color: #0062CC;
				display: inline-block;
			}
		</style>
	</head>
	<body>
		<div class="block"></div>
		<div class="container"></div>
		<div class="container"></div>
	</body>
	<script>
		var block = document.getElementsByClassName("block")[0];
		block.ondragstart = null;
                block.setAttribute("draggable", true);
                block.ondragstart = function(e) {
        	    e.dataTransfer.effectAllowed = 'copy';
                    e.dataTransfer.dropEffect = 'copy';
                    var data = 'text';
                    e.dataTransfer.setData("text", data);    //在ie下第一個參數必須為 ‘text’, 谷歌和火狐則随意
                }
		var doms = document.getElementsByTagName("div");
		for(var i=0;i<doms.length;i++){
			doms[i].ondragover = function(e) {
				e.target.style.cursor = "pointer";
            	                e.preventDefault();  // 這段不寫會觸發不了ondrop事件
			} 
			doms[i].ondragenter = function(e) {
				e.preventDefault();
			}
			doms[i].ondragleave = function(e) {
                                e.target.style.cursor = "";
				e.preventDefault();
			}
			doms[i].ondrop = function(e) {
				var data = e.dataTransfer.getData("text");
				var block = document.createElement("div");
				block.className="block"
				e.target.appendChild(block);
				e.preventDefault();
			}
		}
	</script>
</html>
           

1、在ondragover方法中需要加上e.preventDefault();(阻止浏覽器預設行為),否則會導緻ondrop方法一直觸發不了。

2、在如果要相容ie浏覽器e.dataTransfer.setData方法的第一個參數必須是'text'或者'Text',否則會報錯。