1. 程式人生 > 實用技巧 >慕課前端入門-JS事件

慕課前端入門-JS事件

1. 概念

事件是可以被JavaScript偵測到的行為,通俗的講就是當用戶與web頁面進行某些互動時,直譯器就會建立響應的event物件以描述事件資訊。
如使用者輸入使用者名稱和密碼,點選登入。瀏覽器就向伺服器傳送登入請求。
常見的事件有:

  • 使用者點選頁面上的內容
  • 滑鼠經過特定的元素
  • 使用者按下鍵盤的某個按鍵
  • 使用者滾動視窗或改變視窗大小
  • 頁面元素載入完成或載入失敗

事件控制代碼(事件處理函式、事件監聽函式):指用於響應某個事件而呼叫的函式。每一個事件均對應一個事件控制代碼,在程式執行時,將相應的函式或語句指定給事件控制代碼。則在事件發生時,瀏覽器便執行指定的函式或語句。

2. 事件定義

事件有三要素:事件物件、事件型別、事件控制代碼。
為特定事件定義監聽函式有三種方式

2.1 直接在html中定義元素的事件相關屬性

<button onclick="alert('hello')">按鈕</button>
<body onclick="init()"></body>

缺點:違反了內容與行為相分離的原則,應儘可能少用
示例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<!-- 以下面程式碼為例,button是事件物件,onclick是事件型別,alert是事件控制代碼 -->
<button onclick="alert('給你說了,不要點')">不要點</button>
<button onclick="noClick()">不要點</button>
</body>
</html>
<script type="text/javascript">
	function noClick(){
		alert("點什麼點,啥都沒有");
	}
</script>

2.2 DOM0級事件

在JavaScript中為元素的事件相關屬性賦值

document.getElementById("btn").onclick=function(){}
document.body.onload=init;
function init(){...}

缺點:此語法實現了“內容與行為相分離”,但元素仍只能繫結一個監聽函式。
示例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<button id="clickme">點選我</button>
</body>
</html>
<script type="text/javascript">
	var btn = document.getElementById("clickme");
	var clickme = function () {
		alert("DOM0級事件繫結方式");
	}
	btn.onclick= clickme;
</script>

2.3 DOM2級事件

高階處理方式,一個事件可以繫結多個監聽函式。但要注意瀏覽器相容問題

btn.addEventListener("click", function(){}, false); //DOM
btn.attachEvent("onclick", function(){}); //IE
document.body.addEventListener("load", init); //DOM
document.bbody.attachEvent("onalod", init);//IE
function init(){...}
element.addEventListener(event, function, useCapture);
/*功能:用於向指定元素新增事件控制代碼
引數:event:必須,事件型別
function:必須,事件控制代碼,即函式
useCapture:可選,布林值 指定事件是否在捕獲或冒泡階段執行,預設false。
*/
element.removeEventListener(event, function, useCapture)
/*功能:移除指定的控制代碼
引數:event:事件型別
function:必須,指定要移除的函式名
useCaption:可選,布林值,指定移除事件控制代碼的階段。
*/

示例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<button id="clickme">點選我</button>
</body>
</html>
<script type="text/javascript">
	var btn = document.getElementById("clickme");
	var clickme = function () {
		alert("我被點選了");
	}
	function click2() {
		alert("我再次被點選了");
	}
	//控制代碼指定匿名函式
	btn.addEventListener('click',function(){alert("什麼事")}, false);//第3個引數預設false
	//控制代碼指定變數
	btn.addEventListener('click', clickme);
	//控制代碼指定方法名
	btn.addEventListener('click',click2);
      btn.removeEventListener('click',clickme);
</script>

總結:

方法區別
html中定義html中寫js程式碼。
缺點:強耦合,不利於程式碼複用
DOM0級事件事件物件的屬性新增繫結事件
優點:鬆耦合。html與js程式碼分離。
缺點:有且只能繫結一個事件
DOM2級事件通過addEventListener函式繫結事件
優點:鬆耦合
支援同一DOM元素註冊多個同類型事件
新增了捕獲和冒泡的概念