亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

javascript筆記--(第二十四章)事件

2024-04-27 15:14:36
字體:
來源:轉載
供稿:網友

事件

內聯模型

這種模型是最傳統接單的一種處理事件的方法。在內聯模型中,事件處理函數是HTML標簽的一個屬性,用于處理指定事件。雖然內聯在早期使用較多,但它是和HTML混寫的,并沒有與HTML分離
<input type="button" value="按鈕" onclick="alert('Lee');"  />//注意單雙引號

腳本模型

var input = document.getElementsByTagName('input')[0];//得到input對象input.onclick = function () {//匿名函數執行	alert('Lee');};

事件對象

事件對象,我們一般稱作為event對象,這個對象是瀏覽器通過函數把這個對象作為參數傳遞過來的。
input.onclick = function (evt) {	var e = evt || window.event;//實現跨瀏覽器兼容獲取event對象	alert(e);};直接接收event對象,是W3C的做法,早期IE不支持,IE自己定義了一個event對象,直接在window.event獲取即可

鼠標事件

通過鼠標事件對象可以獲取到鼠標按鈕信息和屏幕坐標獲取等可視區及屏幕坐標
<!DOCTYPE html><head>	<meta charset="UTF-8">	<title>Document</title></head><body>	<div style="width:300px;margin-left:100px;height:300px;background-color: red"></div></body><script type="text/javascript">	document.getElementsByTagName("div")[0].onclick = function (evt) {					var e = evt || window.event;		console.log(e.clientX + ',' + e.clientY);		console.log(e.screenX + ',' + e.screenY);		console.log(e.offsetX + ',' + e.offsetY);		console.log(e.pageX + ',' + e.pageY);	};</script></html>

鍵盤事件

鍵碼

在發生keydown和keyup事件時,event對象的keyCode屬性中會包含一個代碼,與鍵盤上一個特定的鍵對應。對數字字母字符集,keyCode屬性的值與ASCII碼中對應小寫字母或數字的編碼相同。字母中大小寫不影響。
<script type="text/Javascript">	document.onkeydown = function (evt) {		console.log(evt.keyCode);//按任意鍵,得到相應的keyCode	};</script>不同的瀏覽器在keydown和keyup事件中,會有一些特殊的情況:在FirefoxOpera中,分號鍵時keyCode值為59,也就是ASCII中分號的編碼;而IE和Safari返回186,即鍵盤中按鍵的鍵碼。

字符編碼

Firefox、Chrome和Safari的event對象都支持一個charCode屬性,這個屬性只有在發生keyPRess事件時才包含值,而且這個值是按下的那個鍵所代表字符的ASCII編碼。此時的keyCode通常等于0或者也可能等于所按鍵的編碼。IE和Opera則是在keyCode中保存字符的ASCII編碼。
function getCharCode(evt) {	var e = evt || window.event;	if (typeof e.charCode == 'number') {		return e.charCode;	} else {		return e.keyCode;	}}PS:可以使用String.fromCharCode()將ASCII編碼轉換成實際的字符。

W3C與IE事件模型

事件對象屬性

function getTarget(evt) {	var e = evt || window.event;	return e.target || e.srcElement;//兼容得到事件目標DOM對象}document.onclick = function (evt) {	var target = getTarget(evt);	alert(target);};

target和currentTarget的區別

currentTarget始終是監聽事件者,而target是事件的真正發出者
<!DOCTYPE html><head>	<meta charset="UTF-8">	<title>Document</title></head><body>	<div id="outdiv" style="width:300px;margin-left:100px;height:300px;background-color: red">		<div id="indiv" style="width:100px;height: 100px;background-color: blue;"></div>	</div></body><script type="text/javascript">	document.getElementById("outdiv").onclick = function (evt) {		var e = evt || window.event;		console.log(e.currentTarget);		console.log(e.target);	};</script></html>藍色框表示點擊藍色區域時的輸出,紅色框表示點擊紅色區域時的輸出。

事件流

事件流是描述的從頁面接受事件的順序,當幾個都具有事件的元素層疊在一起的時候,那么你點擊其中一個元素,并不是只有當前被點擊的元素會觸發事件,而層疊在你點擊范圍的所有元素都會觸發事件。事件流包括兩種模式:冒泡和捕獲。事件冒泡,是從里往外逐個觸發。事件捕獲,是從外往里逐個觸發。那么現代的瀏覽器默認情況下都是冒泡模型,而捕獲模式則是早期的Netscape默認情況。而現在的瀏覽器要使用DOM2級模型的事件綁定機制才能手動定義事件流模式。在阻止冒泡的過程中,W3C和IE采用的不同的方法,那么我們必須做一下兼容。
function stopPro(evt) {	var e = evt || window.event;	window.event ? e.cancelBubble = true : e.stopPropagation(); }

事件綁定

傳統事件綁定的問題

前面定義的事件函數會被后面定義的事件函數覆蓋
window.onload = function () {//第一組程序項目或第一個JS文件	alert('Lee');};window.onload = function () {//第二組程序項目或第二個JS文件,會覆蓋上面的函數	alert('Mr.Lee');};解決覆蓋問題
<script type="text/javascript">	function addEvent(obj, type, fn) {//取代傳統事件處理函數		var saved = null;//保存每次觸發的事件處理函數		if (typeof obj['on' + type] == 'function') {//判斷是不是事件			saved = obj['on' + type];//如果有,保存起來		}		obj['on' + type] = function () {			if (saved) saved();//執行上一個				fn.call(this);//執行函數,把this傳遞過去		};	}	var box = document.getElementById("outdiv");	addEvent(box,"click",function(){		console.log("fun1");	});	addEvent(box,"click",function(){		console.log("fun2");	});	addEvent(box,"click",function(){		console.log("fun3");	});</script>

W3C事件處理函數

“DOM2級事件”定義了兩個方法,用于添加事件和刪除事件處理程序的操作:addEventListener()和removeEventListener()。所有DOM節點中都包含這兩個方法,并且它們都接受3個參數;事件名、函數、冒泡或捕獲的布爾值(true表示捕獲,false表示冒泡)。
window.addEventListener('load', function () {	alert('Lee');}, false);window.addEventListener('load', function () {	alert('Mr.Lee');}, false);W3C的現代事件綁定比我們自定義的好處就是:1.不需要自定義了;2.可以屏蔽相同的函數;3.可以設置冒泡和捕獲。
window.addEventListener('load', init, false);//第一次執行了window.addEventListener('load', init, false);//第二次被屏蔽了

IE事件處理函數

IE實現了與DOM中類似的兩個方法:attachEvent()和detachEvent()。這兩個方法接受相同的參數:事件名稱和函數。在使用這兩組函數的時候,先把區別說一下:1.IE不支持捕獲,只支持冒泡;2.IE添加事件不能屏蔽重復的函數;3.IE中的this指向的是window而不是DOM對象。4.在傳統事件上,IE是無法接受到event對象的,但使用了attchEvent()卻可以,但有些區別。函數重復問題
<script type="text/javascript">	var box = document.getElementById("outdiv");	box.attachEvent('onclick', init);	box.attachEvent('onclick', init);	function init(){		alert("init")	}</script>this問題
<script type="text/javascript">	var box = document.getElementById("outdiv");	box.attachEvent('onclick', function () {		alert(this === window);//this指向的window	});	box.attachEvent('onclick', function () {				toBlue.call(box);//可以把this直接call過去	});</script>event對象傳參
<script type="text/javascript">	var box = document.getElementById("outdiv");	box.onclick = function (evt) {		alert(evt);//undefined	};	//定義了傳統事件后,還可以繼續綁定事件,不會覆蓋	box.attachEvent('onclick', function (evt) {		alert(evt);//object		alert(evt.type);//click		});</script>PS:IE中的事件綁定函數attachEvent()和detachEvent()可能在實踐中不去使用,有幾個原因:1.IE9就將全面支持W3C中的事件綁定函數;2.IE的事件綁定函數無法傳遞this;3.IE的事件綁定函數不支持捕獲;4.同一個函數注冊綁定后,沒有屏蔽掉;5.有內存泄漏的問題。至于怎么替代,我們將在以后的項目課程中探討。

事件對象的其他補充

relatedTarget屬性

在W3C提供了一個屬性:relatedTarget;這個屬性可以在mouSEOver和mouseout事件中獲取從哪里移入和從哪里移出的DOM對象。
<script type="text/javascript">	var box = document.getElementById("indiv");	box.onmouseover = function (evt) {//鼠標移入box		console.log(evt.relatedTarget);//獲取移入box最近的那個元素對象	}	box.onmouseout = function (evt) {//鼠標移出box		console.log(evt.relatedTarget);//獲取移出box最近的那個元素對象	}</script>IE提供了兩組分別用于移入移出的屬性:fromElement和toElement,分別對應mouseover和mouseout。
<script type="text/javascript">	var box = document.getElementById("indiv");	box.onmouseover = function (evt) {//鼠標移入box		console.log(window.event.fromElement.tagName);//獲取移入box最近的那個元素對象span	}	box.onmouseout = function (evt) {//鼠標移入box		console.log(window.event.toElement.tagName);//獲取移入box最近的那個元素對象span	}</script>

組織瀏覽器默認行為

<script type="text/javascript">	link.onclick = function () {		alert('Lee');		return false;//直接給個假,就不會跳轉了。	};	link.onclick = function (evt) {		evt.preventDefault();//W3C,阻止默認行為,放哪里都可以		alert('Lee');	};	link.onclick = function (evt) {	//IE,阻止默認行為		window.event.returnValue = false;		alert('Lee');	};</script>

阻止右鍵菜單

<script type="text/javascript">	document.addEventListener("contextmenu",function(event){		event.preventDefault();		console.log("hehe");	},false);</script>

卸載前事件:beforeunload

用beforeunload事件,在某些瀏覽器上(chrome、ie、firefox)可以監聽到瀏覽器關閉操作,能夠在關閉之前,彈出一個對話框,讓用戶選擇是否關閉
<script type="text/javascript">	window.addEventListener("beforeunload", function (e) {  		var confirmationMessage = '確定離開此頁嗎?本頁不需要刷新或后退';		 (e || window.event).returnValue = confirmationMessage; // Gecko and Trident		 return confirmationMessage;// Gecko and WebKit	});</script>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人一区二区三区吃奶| 91成人天堂久久成人| 日本乱人伦a精品| 久久午夜a级毛片| www.欧美免费| 国产精品美女www| 亚洲一区精品电影| 亚洲人成在线观看| 欧美性猛交xxxx免费看久久久| 久久久噜噜噜久久久| 国产精品中文久久久久久久| 国产91精品青草社区| 亚洲国产欧美日韩精品| 91精品视频一区| 国产精品视频yy9099| 亚洲大胆人体av| 亚洲福利在线播放| 在线国产精品视频| 久久精品国产v日韩v亚洲| 91在线免费视频| 成人性生交大片免费观看嘿嘿视频| 日本精品久久中文字幕佐佐木| 7777免费精品视频| 欧美专区在线视频| 亚洲图片在区色| 77777少妇光屁股久久一区| 午夜精品一区二区三区在线视频| 97av在线视频免费播放| 一区二区三区动漫| 91香蕉亚洲精品| 久久99国产综合精品女同| 亚洲欧美成人一区二区在线电影| 一色桃子一区二区| 欧美天堂在线观看| 亚洲国产成人精品女人久久久| 欧美不卡视频一区发布| 精品久久久久久久久国产字幕| 国内精品一区二区三区| 亚洲黄一区二区| 久热爱精品视频线路一| 97色在线观看| 亚洲精品免费一区二区三区| 亚洲天堂成人在线视频| 国产精品嫩草影院久久久| 在线观看欧美日韩国产| 在线视频国产日韩| 日韩中文字幕精品| 国产亚洲一区二区在线| 亚洲性线免费观看视频成熟| 色综合91久久精品中文字幕| 欧美日本啪啪无遮挡网站| 久久久人成影片一区二区三区观看| 中文字幕免费精品一区| 国产精品草莓在线免费观看| 亚洲国模精品一区| 国产精品青青在线观看爽香蕉| 一夜七次郎国产精品亚洲| 色婷婷久久一区二区| 最新中文字幕亚洲| 国产精品吊钟奶在线| 亚洲亚裔videos黑人hd| 亚洲一区二区自拍| 高清一区二区三区日本久| 亚洲精品v天堂中文字幕| 欧美亚洲在线播放| 美日韩精品免费视频| 欧美成人午夜激情视频| 欧美日韩国产一区在线| 7m精品福利视频导航| 91国语精品自产拍在线观看性色| 亚洲黄色www网站| 国产99在线|中文| 国产精品黄色影片导航在线观看| 日韩精品黄色网| 日韩二区三区在线| 国产欧美一区二区白浆黑人| 日韩av日韩在线观看| 欧美有码在线视频| 日韩亚洲第一页| 国产一区视频在线播放| 九九久久久久99精品| 中文字幕亚洲字幕| 国产成人综合精品| 亚洲日韩欧美视频一区| 亚洲欧美日韩精品久久奇米色影视| 国产在线视频欧美| 97精品视频在线观看| 8x拔播拔播x8国产精品| 国产精品亚洲第一区| 中文日韩在线观看| 国产精品入口免费视频一| 亚洲黄色av女优在线观看| 欧美激情综合亚洲一二区| 亚洲三级黄色在线观看| 欧美丰满老妇厨房牲生活| 国产亚洲美女精品久久久| 国产精品久久久久av| 日韩高清电影免费观看完整| 国产日韩欧美一二三区| 日韩一区二区三区国产| 久久久久久久影院| 91tv亚洲精品香蕉国产一区7ujn| 欧美床上激情在线观看| 久久久噜噜噜久久| 亚洲日本aⅴ片在线观看香蕉| 亚洲最大福利视频网站| 国产日韩av在线| 韩国一区二区电影| 亚洲aa在线观看| 精品国产一区二区三区久久狼黑人| 亚洲国产另类 国产精品国产免费| 久久视频国产精品免费视频在线| 色av中文字幕一区| 成人羞羞国产免费| 国产精品福利在线| 精品动漫一区二区| 国产丝袜精品视频| 国产精品福利片| 久久影院中文字幕| 成人在线激情视频| 欧美国产日韩免费| 中文字幕亚洲一区二区三区五十路| 日韩视频第一页| 欧美日韩精品在线观看| 欧美极品少妇xxxxⅹ喷水| 久久久国产精品x99av| 91免费版网站入口| 国产精品丝袜白浆摸在线| 欧美极品少妇全裸体| 国产精品嫩草影院一区二区| 最新亚洲国产精品| 国产视频精品免费播放| 成人久久精品视频| 国产精品69久久久久| 欧美另类极品videosbest最新版本| 日韩欧美大尺度| 深夜精品寂寞黄网站在线观看| 久久精彩免费视频| 亚洲一区二区三区视频| 成人网在线免费看| 亚洲美女av网站| 国产精品极品尤物在线观看| 精品呦交小u女在线| 懂色aⅴ精品一区二区三区蜜月| 精品高清一区二区三区| 97av在线视频| 91色在线观看| 亚洲自拍偷拍福利| 成人午夜在线视频一区| 国产精品丝袜久久久久久不卡| 国产精品久久久久久婷婷天堂| 亚洲最大的免费| 日韩欧美国产免费播放| 国产一区二区三区在线播放免费观看| 国产日产欧美精品| 久久国产精彩视频| 91免费高清视频| 国产精品久久综合av爱欲tv| 欧美视频一区二区三区…| 日韩中文在线视频| 午夜精品视频网站| 欧美人与性动交a欧美精品| 一区二区三区亚洲| 国产91热爆ts人妖在线|