1. 程式人生 > >JavaScript 之預設行為 DOM2級,事件委託機制

JavaScript 之預設行為 DOM2級,事件委託機制

1. 事件預設行為及阻止方式

   1.1 瀏覽器的預設行為      

JavaScript事件本身所具有的屬性,例如a標籤的跳轉,Submit按鈕的提交,右鍵選單,文字框的輸入等。

   1.2 阻止預設行為的方式  

event.preventDefault();  event.returnValue = false;  return false; 

//IE低版本和其他版本都支援return false,而其他兩種IE低版本不支援。

<a href="">click here.</a>
<script type="text/javascript">
    var aLink = document.getElementsByTagName("a")[0];
	aLink.onclick = function(e){
		var evt = e || event;
				
		console.log("aaa");
		//return false;                //1
		//evt.preventDefault();        //2
		evt.returnValue = false;        //3
	}
</script>

自定義右鍵選單 oncontextmenu

ul{                        /*選單的css樣式*/
	display: none;
	position: absolute;
	top: 0;
	left: 0;
}
var oUl = document.getElementsByTagName("ul")[0];
	document.oncontextmenu = function(e){        //右鍵點哪裡,在哪裡出現選單
	var evt = e || event;
	oUl.style.display = "block";
	oUl.style.left = evt.clientX + "px";
	oUl.style.top = evt.clientY + "px";
}

小例子來練手: 

//			文字框只能輸入數字
			var aInput = document.getElementsByTagName("input")[0];
			aInput.onkeydown = function(e){
				var evt = e || event;
				//console.log(evt.keyCode);//48-57
				if(evt.keyCode < 48 || evt.keyCode > 57){
					return false;
				}
			}

2. DOM2級事件處理程式

DOM2級事件處理程式可以為一個元素新增多個事件處理程式。其定義了兩個方法用於新增和刪除事件處理程式:addEventListener()和removeEventListener()。

新增事件監聽器:addEventListener(事件名,處理函式,布林值)  

移除事件監聽器:removeEventListener(事件名,處理函式,布林值)

注意:事件名不帶on,處理函式為函式指標,布林值代表冒泡或捕獲。現在的版本可以省略第三個引數,預設值為false

這個布林值為true,在捕獲階段處理事件,為false,在冒泡階段處理事件,預設為false。

var outer = document.getElementById("outer");
				
	outer.addEventListener("click",foo,true);            //新增事件監聽器
	outer.removeEventListener("click",foo,true);        //移除
	function foo(){
		console.log("aaa");
}
        //通過addEventListener()新增的事件處理程式只能使用removeEventListener()來移除;移除時傳入的引數與新增處理程式時使用的引數相同。這也意味著通過addEventListener()新增的匿名函式無法移除,需另外定義一個函式

   *普通時間不存在相容問題,而DOM2級事件存在相容性問題,IE低版本物件不支援“addEventListener”屬性或方法,

IE下的事件監聽器:attachEvent(事件名,處理函式),detachEvent(事件名,處理函式) 注意:事件名帶on。

道高一尺,魔高一丈,我們可以自己封裝一個函式解決相容問題。

function foo(){
	console.log("aaa");
}
function addEvent(obj){
	if(obj.addEventListener){
		return obj.addEventListener("click",foo);
	}else{
		return obj.attachEvent("onclick",foo);
	}
}
addEvent(outer);

3. 事件委託機制  

利用事件冒泡的原理,把本應新增給某元素上的事件委託給他的父級(外層)。

實現拖拽效果

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			div{
				width: 100px;
				height: 100px;
				background: aquamarine;
				position: absolute;
				top: 0;
				left: 0;
			}
		</style>
	</head>
	<body>
		<div></div>
		<script type="text/javascript">
			var oDiv = document.getElementsByTagName("div")[0];
			oDiv.onmousedown = function(e){
				var evt = e || event;
				_left = evt.offsetX;
				_top = evt.offsetY;
				document.onmousemove = function(e){
					var evt = e || event;
					x = evt.clientX - _left;
					y = evt.clientY - _top;
					if(x<=0){x=0;}
					if(x >= document.documentElement.clientWidth - oDiv.offsetWidth){
						x = document.documentElement.clientWidth - oDiv.offsetWidth;
					}
					if(y >= document.documentElement.clientHeight - oDiv.offsetHeight){
						y = document.documentElement.clientHeight - oDiv.offsetHeight;
					}
					if(y<=0){y=0;}
					oDiv.style.left = x + "px";
					oDiv.style.top = y + "px";
				}
				document.onmouseup = function(){
					document.onmousemove = null;
				}
			}
		</script>
	</body>
</html>