javascript基礎(滑鼠事件拖拽,setCapture()方法)(三十六)

厚積薄發2017發表於2017-02-14

1.大概實現拖拽

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
			
			#box2{
				width: 100px;
				height: 100px;
				background-color: yellow;
				position: absolute;
				
				top: 200px;
				left: 500px;
			}
			
		</style>
		
		<script type="text/javascript">
			
			window.onload = function(){
				/*
				 * 使滑鼠可以在頁面中來拖拽box1
				 * 
				 * 拖拽的流程:
				 * 	1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				 * 	2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
				 * 	3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
				 */
				
				
				//1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				//為box1繫結一個滑鼠按下的事件
				var box1 = document.getElementById("box1");
				box1.onmousedown = function(){
					
					//2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
					//為document繫結一個滑鼠移動的事件
					document.onmousemove = function(event){
						event = event || window.event;
						
						//獲取滑鼠的座標
						var left = event.clientX;
						var top = event.clientY;
						
						//修改box1的位置
						box1.style.left = left + "px";
						box1.style.top = top + "px";
						
					};
					
					//3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
					document.onmouseup = function(){
						//當滑鼠鬆開時,將元素固定在當前位置,取消document的onmousemove事件
						document.onmousemove = null;
						//onmouseup事件只需要執行一次,執行過一次以後就沒有存在的意義了
						document.onmouseup = null;
						
					};
					
				};
			};
			
			
		</script>
	</head>
	<body>
		
		<div id="box1"></div>
		
		<div id="box2"></div>
		
	</body>
</html>


 

2.完善一:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
			
			#box2{
				width: 100px;
				height: 100px;
				background-color: yellow;
				position: absolute;
				
				top: 200px;
				left: 500px;
			}
			
		</style>
		
		<script type="text/javascript">
			
			window.onload = function(){
				/*
				 * 使滑鼠可以在頁面中來拖拽box1
				 * 
				 * 拖拽的流程:
				 * 	1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				 * 	2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
				 * 	3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
				 */
				
				
				//1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				//為box1繫結一個滑鼠按下的事件
				var box1 = document.getElementById("box1");
				box1.onmousedown = function(event){
					event = event || window.event;
					
					//設定box1捕獲所有的滑鼠按下的事件
					//在chrome中沒有setCapture()和releaseCapture()方法
					//所以呼叫會導致瀏覽器報錯
					/*if(box1.setCapture){
						box1.setCapture();
					}*/
					box1.setCapture && box1.setCapture();
					
					//求元素的偏移量
					//clientX - offsetLeft
					var ol = event.clientX - box1.offsetLeft;
					var ot = event.clientY - box1.offsetTop;
					
					/*
					 * 目前我們的元素的左上角和滑鼠指標重合,
					 * 	我們希望我們點選元素時,滑鼠和元素的相對的位置保持不變
					 */
					
					//2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
					//為document繫結一個滑鼠移動的事件
					document.onmousemove = function(event){
						event = event || window.event;
						
						//獲取滑鼠的座標
						var left = event.clientX - ol;
						var top = event.clientY - ot;
						
						//修改box1的位置
						box1.style.left = left + "px";
						box1.style.top = top + "px";
						
					};
					
					//3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
					document.onmouseup = function(){
						//當滑鼠鬆開時,將元素固定在當前位置,取消document的onmousemove事件
						document.onmousemove = null;
						//onmouseup事件只需要執行一次,執行過一次以後就沒有存在的意義了
						document.onmouseup = null;
						
						/*if(box1.releaseCapture){
							//設定box1不再對所有的事件進行捕獲
							box1.releaseCapture();
						}*/
						box1.releaseCapture && box1.releaseCapture();
						
						
					};
					
					/*
					 * 當我們在瀏覽器中選中一個文字或一個內容並拖動時,瀏覽器會自動去搜尋引擎中搜尋該內容
					 * 	但是這個行為的出現會導致拖拽功能出現異常,這一行為是瀏覽器的預設行為
					 * 如果不希望發生該行為,則可以在onmousedown事件中取消預設行為
					 * 
					 * 但是這個方法對IE8不起作用
					 */
					
					return false;
					
				};
			};
			
			
		</script>
	</head>
	<body>
		
		我是一段文字
		
		<div id="box1"></div>
		
		<div id="box2"></div>
		
	</body>
</html>

2.1.setCapture()方法測試:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		
		<script type="text/javascript">
			
			window.onload = function(){
				
				//為兩個按鈕繫結單擊響應函式
				var btn01 = document.getElementById("btn01");
				var btn02 = document.getElementById("btn02");
				
				btn01.onclick = function(){
					alert(1);
				}
				
				btn02.onclick = function(){
					alert(2);
				}
				
				/*
				 * 當元素設定setCapture()以後
				 * 	元素將會自動將下一次滑鼠點選相關的事件捕獲到自身上
				 */
				btn01.setCapture();
				
			};
			
		</script>
		
	</head>
	<body>
		
		<button id="btn01">按鈕1</button>
		<button id="btn02">按鈕2</button>
	</body>
</html>


 


3.完善二

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box1 {
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
			
			#box2 {
				width: 100px;
				height: 100px;
				background-color: yellow;
				position: absolute;
				top: 200px;
				left: 500px;
			}
		</style>

		<script type="text/javascript">
			window.onload = function() {
				/*
				 * 使滑鼠可以在頁面中來拖拽box1
				 * 
				 * 拖拽的流程:
				 * 	1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				 * 	2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
				 * 	3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
				 */

				//1.當滑鼠在元素上按下時,開始拖拽 	onmousedown
				//為box1繫結一個滑鼠按下的事件
				var box1 = document.getElementById("box1");
				
				drag(box1);

				var box2 = document.getElementById("box2");
				
				drag(box2);
				
				var img1 = document.getElementById("img1");
				
				drag(img1);

			};

			/*
			 * 提取一個可以拖拽任意元素的函式
			 * 	obj 要拖拽的元素
			 */
			function drag(obj) {
				obj.onmousedown = function(event) {
					event = event || window.event;

					//設定box1捕獲所有的滑鼠按下的事件
					//在chrome中沒有setCapture()和releaseCapture()方法
					//所以呼叫會導致瀏覽器報錯
					/*if(box1.setCapture){
						box1.setCapture();
					}*/
					obj.setCapture && obj.setCapture();

					//求元素的偏移量
					//clientX - offsetLeft
					var ol = event.clientX - obj.offsetLeft;
					var ot = event.clientY - obj.offsetTop;

					/*
					 * 目前我們的元素的左上角和滑鼠指標重合,
					 * 	我們希望我們點選元素時,滑鼠和元素的相對的位置保持不變
					 */

					//2.當滑鼠移動時,元素跟隨滑鼠移動 	onmousemove
					//為document繫結一個滑鼠移動的事件
					document.onmousemove = function(event) {
						event = event || window.event;

						//獲取滑鼠的座標
						var left = event.clientX - ol;
						var top = event.clientY - ot;

						//修改box1的位置
						obj.style.left = left + "px";
						obj.style.top = top + "px";

					};

					//3.當滑鼠鬆開時,元素固定在當前位置,拖拽結束	onmouseup
					document.onmouseup = function() {
						//當滑鼠鬆開時,將元素固定在當前位置,取消document的onmousemove事件
						document.onmousemove = null;
						//onmouseup事件只需要執行一次,執行過一次以後就沒有存在的意義了
						document.onmouseup = null;

						/*if(box1.releaseCapture){
							//設定box1不再對所有的事件進行捕獲
							box1.releaseCapture();
						}*/
						obj.releaseCapture && obj.releaseCapture();

					};

					/*
					 * 當我們在瀏覽器中選中一個文字或一個內容並拖動時,瀏覽器會自動去搜尋引擎中搜尋該內容
					 * 	但是這個行為的出現會導致拖拽功能出現異常,這一行為是瀏覽器的預設行為
					 * 如果不希望發生該行為,則可以在onmousedown事件中取消預設行為
					 * 
					 * 但是這個方法對IE8不起作用
					 */

					return false;

				};
			}
		</script>
	</head>

	<body>

		我是一段文字

		<div id="box1"></div>

		<div id="box2"></div>
		
		<img id="img1" style="position: absolute;" src="img/an.jpg"/>

	</body>

</html>


 

 

 

 

相關文章