Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
件處理
客戶端js程序采用異步事件驅(qū)動(dòng)編程模型。在這種情況下當(dāng)文檔,瀏覽器,元素發(fā)生一些事情的時(shí)候,會(huì)產(chǎn)生事件。
舉例 當(dāng)瀏覽器加載完文檔以后會(huì)觸發(fā)一個(gè)事件。該事件會(huì)有一個(gè)函數(shù)進(jìn)行處理,即回調(diào)函數(shù)
這種只不單單用于web界面,所有使用圖形界面的應(yīng)用程序都采用了這種方式。
事件分類
依賴于設(shè)備的輸入事件
有些事件和特定輸入設(shè)備直接相關(guān)。比如鼠標(biāo)和鍵盤。
touchmove 當(dāng)觸點(diǎn)在觸控平面上時(shí)發(fā)生該事件
獨(dú)立于設(shè)備的輸入事件
click事件表示激活了鏈接的事件。通過鼠標(biāo),按鈕或者移動(dòng)設(shè)備上的觸摸觸發(fā)該事件
用戶界面事件
通常用于HTML表單元素,包括文本輸入域獲取鍵盤焦點(diǎn)的focus事件,提交按鈕將會(huì)觸發(fā)submit事件
狀態(tài)變化事件
不是由用戶活動(dòng)由網(wǎng)絡(luò)或者瀏覽器活動(dòng)觸發(fā),表示某種生命周期或相關(guān)狀態(tài)的變化。
online 返回瀏覽器的聯(lián)網(wǎng)狀態(tài)
特定的api事件
一些web api會(huì)有自己的事件類型
拖放的api dragstart 當(dāng)用戶拖動(dòng)一個(gè)元素,或者選擇一個(gè)文本的時(shí)候觸發(fā)該事件
計(jì)時(shí)器和錯(cuò)誤處理程序
計(jì)時(shí)器在指定的時(shí)間后觸發(fā)該事件,錯(cuò)誤處理程序,try catch 對(duì)應(yīng)于一個(gè)響應(yīng),會(huì)有異步進(jìn)行拋出
傳統(tǒng)事件類型
表單事件
當(dāng)提交表單和重置表單時(shí)會(huì)觸發(fā)submit和reset事件,當(dāng)用戶和類按鈕(包括單選和復(fù)選)交互的時(shí),將會(huì)發(fā)生click事件,當(dāng)用戶輸入文字,選擇選項(xiàng)或選擇復(fù)選框改變相應(yīng)的表單元素的狀態(tài)時(shí),將會(huì)觸發(fā)change事件,通過鍵盤改變焦點(diǎn)的表單元素在得到和失去焦點(diǎn)時(shí)將會(huì)觸發(fā)focus和blur事件。
通過事件處理程序能取消submit和reset事件的默認(rèn)操作。某些click事件也是如此,focus和clur事件不會(huì)冒泡,但其他所有表單事件都可以。
無(wú)論用戶何時(shí)輸入文字,都會(huì)觸發(fā)input事件。
window事件
window事件是指事件的發(fā)生與瀏覽器窗口本身而非窗口中顯示的任何特定文檔內(nèi)容相關(guān)。
load事件
load事件與文檔和其所有外部資源(圖片)完全加載并顯示給用戶時(shí)將會(huì)觸發(fā)。
unload事件
unload事件,當(dāng)用戶離開當(dāng)前文檔轉(zhuǎn)向其他文檔時(shí)將會(huì)觸發(fā)。
unload事件處理程序可以用于保存用戶的狀態(tài),但其不能取消用戶轉(zhuǎn)向其他地方。
beforeunload事件
此事件將會(huì)詢問用戶是否確定離開當(dāng)前頁(yè)面。如果beforeunload的回調(diào)函數(shù)返回一個(gè)字符串,那么在新頁(yè)面加載之前,字符串將會(huì)出現(xiàn)在展示給用戶確認(rèn)的對(duì)話框上,這樣用戶將會(huì)有機(jī)會(huì)取消跳轉(zhuǎn)停留在當(dāng)前頁(yè)上
注意;該事件僅僅是在當(dāng)前頁(yè)面的跳轉(zhuǎn)更改等,轉(zhuǎn)換標(biāo)簽不會(huì)觸發(fā)該事件
onerror屬性
此為一個(gè)window對(duì)象的屬性。在js出錯(cuò)的時(shí)候?qū)?huì)觸發(fā)其
其他
像img元素這樣的替換元素也能為其注冊(cè)load和error事件處理程序。當(dāng)外部資源完全加載或發(fā)生阻塞加載錯(cuò)誤時(shí)將會(huì)觸發(fā)該事件。某些瀏覽器也支持about事件,當(dāng)圖強(qiáng)因?yàn)橛脩敉V辜虞d進(jìn)程而導(dǎo)致失敗的時(shí)候也會(huì)觸發(fā)該事件。
focus和blur事件也為window事件,當(dāng)瀏覽器窗口從操作系統(tǒng)中得到或失去鍵盤焦點(diǎn)的時(shí)候?qū)?huì)觸發(fā)該事件
當(dāng)用戶調(diào)整瀏覽器窗口大小或滾動(dòng)其會(huì)觸發(fā)resize和scroll事件,scroll事件也能在任何可以滾動(dòng)的文檔元素上觸發(fā),例如css的的overflow屬性也能觸發(fā)。
鼠標(biāo)事件
當(dāng)用戶在文檔上移動(dòng)和單擊鼠標(biāo)時(shí)都會(huì)產(chǎn)生鼠標(biāo)事件。這些事件在鼠標(biāo)指針?biāo)鶎?duì)應(yīng)的最深嵌套元素上觸發(fā)。但其會(huì)冒泡直到文檔的最頂層。
clientX和clientY屬性指定了鼠標(biāo)在窗口坐標(biāo)中的位置。button和which屬性指定了按下的鼠標(biāo)鍵是哪個(gè)。
當(dāng)鼠標(biāo)輔助鍵按下的時(shí)候,對(duì)應(yīng)的屬性為altkey和ctrlkey和metakey和shiftkey會(huì)設(shè)置為true,對(duì)于click事件,detail屬性指定了其是單擊,雙擊,還是三擊。
每當(dāng)用戶移動(dòng)和拖動(dòng)鼠標(biāo)時(shí),會(huì)觸發(fā)mousemove事件,當(dāng)用戶按下或釋放鼠標(biāo)按鍵的時(shí)候觸發(fā)mousedown和mouseup事件。
在mousedown和mouseup事件隊(duì)列之后,瀏覽器也會(huì)觸發(fā)click事件,如果用戶在很短的時(shí)間內(nèi)單擊兩次鼠標(biāo),則第二個(gè)事件為dblclic事件,當(dāng)單擊鼠標(biāo)右鍵時(shí),瀏覽器會(huì)顯示上下文菜單,在顯示菜單之前,也會(huì)觸發(fā)contextmenu事件,如果取消這個(gè)事件將會(huì)阻止菜單的顯示,該事件為獲得鼠標(biāo)右擊通知的最簡(jiǎn)單方法。
當(dāng)用戶移動(dòng)鼠標(biāo)指針從而使它懸停到新元素上時(shí),瀏覽器就會(huì)在該元素上觸發(fā)mouseover事件,當(dāng)鼠標(biāo)移動(dòng)指針從而使它不在懸停在某個(gè)元素上時(shí),瀏覽器會(huì)觸發(fā)mouseout事件,(該事件有relatedTarget屬性指明這個(gè)過程涉及的其他元素)
當(dāng)用戶滾動(dòng)鼠標(biāo)的時(shí)候,瀏覽器觸發(fā)mousewheel事件,傳遞事件對(duì)象屬性指定輪子轉(zhuǎn)動(dòng)的大小和方向。
鍵盤事件
當(dāng)鍵盤聚焦到web瀏覽器時(shí),用戶每次按下或釋放鍵盤上的按鍵時(shí)都會(huì)產(chǎn)生事件,鍵盤快捷鍵葉同樣能被瀏覽器和操作系統(tǒng)吃掉,此時(shí)對(duì)js事件處理程序不可見,無(wú)論任何文檔元素獲取鍵盤焦點(diǎn)都會(huì)觸發(fā)鍵盤事件,并會(huì)冒泡到window對(duì)象,
觸摸屏和移動(dòng)設(shè)備事件
用戶旋轉(zhuǎn)設(shè)備的時(shí)會(huì)產(chǎn)生orientationchange事件,有一個(gè)縮放和旋轉(zhuǎn)手勢(shì),當(dāng)手勢(shì)開始時(shí)將會(huì)生成getsturestart事件,手勢(shì)結(jié)束時(shí)將會(huì)生成gestureend事件。在這兩個(gè)事件之間是跟蹤手勢(shì)過程的gesturechange事件隊(duì)列,將事件傳遞的事件對(duì)象屬性為scale和rotation
握緊手勢(shì)的scale值小于1.0
撐開手勢(shì)的scale的值大于1.0
rotation為事件開始時(shí)手指旋轉(zhuǎn)的角度。以度為單位正值表示順時(shí)針方向旋轉(zhuǎn)
當(dāng)手指觸摸屏幕的時(shí)候?qū)?huì)觸發(fā)touchstart事件,當(dāng)手指移動(dòng)時(shí)會(huì)觸發(fā)touchmove事件,當(dāng)手指離開屏幕時(shí)會(huì)觸發(fā)touchend事件,觸摸事件傳遞的事件對(duì)象有一個(gè)changedTouches屬性,該屬性為一個(gè)類數(shù)組對(duì)象,其每個(gè)元素都描述觸摸的位置。
當(dāng)設(shè)備允許用戶從豎屏旋轉(zhuǎn)到橫屏模式時(shí)會(huì)在window對(duì)象上觸發(fā)orientationchanged事件。該對(duì)象的orientation屬性能給出當(dāng)前方位,其值為0, 90, 180, 或 -90
注冊(cè)事件處理程序
設(shè)置js對(duì)象屬性為事件處理程序
事件處理程序?qū)傩缘拿钟蒾n后面跟著事件名組成。onclick,onchange,onload,onmouseover
onload 當(dāng)對(duì)象的資源被加載的時(shí)候,該對(duì)象的onload事件將會(huì)被觸發(fā),然后將表單的提交的onsubmit事件和一個(gè)處理函數(shù)進(jìn)行綁定
onsubmit 在表單提交的時(shí)候,將會(huì)觸發(fā)該事件
下方栗子演示一個(gè)提交的時(shí)候表單驗(yàn)證的過程
其中validate函數(shù)為一個(gè)自定義的表單驗(yàn)證函數(shù),其函數(shù)的參數(shù)this指向elt
window.onload=()=> {
// 查找一個(gè)<form>元素
var elt=document.getElementById("shipping_address");
// 注冊(cè)事件處理程序函數(shù)
// 在表單提交之前調(diào)用該函數(shù)
elt.onsubmit=()=> { return validate(this); };
}
設(shè)置HTML標(biāo)簽屬性為事件處理程序
<button onclick="alert('Thank you');">點(diǎn)擊這里</button>
點(diǎn)擊按鈕會(huì)彈出一個(gè)對(duì)話框
addEventListener()
為事件綁定一個(gè)處理的函數(shù)
<script>
var b=document.getElementById("my button");
b.onclick=()=> { alert("Thanks for clicking me!"); };
b.addEventListener("click", ()=> { alert("Thanks again!"); }, false); // 最后一個(gè)參數(shù)為是否進(jìn)行冒泡
</script>
上方會(huì)彈出兩個(gè)對(duì)話框,一個(gè)觸發(fā)了onclick事件,一個(gè)觸發(fā)了addEventListener注冊(cè)的click事件。
注冊(cè)的click處理的函數(shù),將會(huì)按照注冊(cè)的順序依次不斷的調(diào)用。(可以注冊(cè)多個(gè)處理程序)。
document.removeEventListener("mousemove", handleMouseMove, true);
移出在mousemove上注冊(cè)的事件,處理函數(shù)為handLenMouseMove,在事件上直接注冊(cè),沒有冒泡的過程。
事件處理程序的調(diào)用
事件處理程序運(yùn)行的環(huán)境
this關(guān)鍵字指的是事件的目標(biāo)。
事件處理程序的作用域
這是個(gè)坑的集散地,表單上有一個(gè)HTML事件處理程序想要引用window的location對(duì)象,必須使用window.location,不能使用location,因?yàn)樵搇ocation為表單作用域鏈上的location
事件處理程序的返回值
如果返回false則告訴瀏覽器不要執(zhí)行這個(gè)事件的默認(rèn)操作。
調(diào)用順序
通過設(shè)置對(duì)象屬性,HTML屬性注冊(cè)的處理程序一直優(yōu)先調(diào)用
使用addEventList注冊(cè)的處理程序,按照DOM的順序進(jìn)行調(diào)用
使用attachEvent()注冊(cè)的事件按照隨機(jī)的順序調(diào)用
事件傳播
當(dāng)事件目標(biāo)為window對(duì)象或其他一些單獨(dú)對(duì)象,瀏覽器會(huì)簡(jiǎn)單的調(diào)用對(duì)象上的處理程序響應(yīng)事件。
調(diào)用目標(biāo)元素上注冊(cè)的事件處理函數(shù)
在調(diào)用目標(biāo)元素上注冊(cè)的事件處理函數(shù)的時(shí)候,該事件會(huì)冒泡到DOM樹的樹跟,調(diào)用目標(biāo)的父元素的事件處理程序,即可以在共同的祖先元素上注冊(cè)一個(gè)處理程序來(lái)處理所有的事件
例如:在form元素上注冊(cè)change事件處理程序取代在表單的每個(gè)元素上注冊(cè)change事件處理程序。
原因:冒泡
注意:load事件,(load當(dāng)資源加載完成以后,將會(huì)觸發(fā)load事件,不單單指整個(gè)文檔)其會(huì)在Document對(duì)象上停止冒泡不會(huì)傳播到window對(duì)象,只有整個(gè)文檔都加載完成的時(shí)候?qū)?huì)觸發(fā)window對(duì)象的load事件
捕獲
事件的第一階段 捕獲 發(fā)生在目標(biāo)處理程序調(diào)用程序之前 addEventener()把一個(gè)布爾值作為其第三個(gè)參數(shù),如果為true那么事件處理程序被注冊(cè)為捕獲事件處理程序,會(huì)在事件傳播的第一個(gè)階段調(diào)用。事件傳播的捕獲階段像是反向的冒泡,,將會(huì)最先調(diào)用window對(duì)象的捕獲處理程序,然后將會(huì)調(diào)用document對(duì)象的捕獲處理程序,接著是body對(duì)象的捕獲處理程序,逐漸按照DOM樹往下,直到調(diào)用事件目標(biāo)的父元素的捕獲事件捕獲。
事件取消
通過調(diào)用事件對(duì)象的preventDefault()方法取消事件的默認(rèn)操作。
文檔加載事件
web應(yīng)用需要web瀏覽器通知它們文檔加載完畢和為操作準(zhǔn)備就緒的時(shí)間。
當(dāng)文檔準(zhǔn)備就緒的時(shí)候調(diào)用函數(shù)
事件冒泡和傳播
事件冒泡屬于微軟的,向上
事件傳播屬于網(wǎng)景瀏覽器(懷舊,一個(gè)時(shí)代,可惜已經(jīng)不存在了),正好相反。
后來(lái)w3c將這兩種給統(tǒng)一了,規(guī)定任何事件首先向下傳播直到遇到目標(biāo)元素,如果沒有遇到冒泡元素,將會(huì)不斷的向上冒泡進(jìn)行返回。
本上所有的PC端事件移動(dòng)端都可以用
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
div{
width: 100vw;
height: 50vh;
background-color: orange;
}
</style>
</head>
<body>
<div></div>
<script type="text/javascript">
//基本上所有的PC端事件移動(dòng)端都可以用
var div=document.getElementsByTagName("div")[0];
/*div.onclick=function(){
this.style.backgroundColor="green";
}*/
div.onmouseover=function(){
this.style.backgroundColor="blue";
}
</script>
</body>
</html>
移動(dòng)端特有的事件
ontouchstart 手指按下
ontouchmove 手指移動(dòng)
ontouchend 手指抬起
ontouchcancel 移動(dòng)端發(fā)生了觸摸中斷, 這個(gè)事件不容易在瀏覽器的模擬器中模擬, 實(shí)際中用的很少。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<style type="text/css">
*{
margin: 0;
padding: 0;
}
div{
width: 100vw;
height: 50vh;
background-color: orange;
}
</style>
</head>
<body>
<div></div>
<script type="text/javascript">
//基本上所有的PC端事件移動(dòng)端都可以用
var div=document.getElementsByTagName("div")[0];
//移動(dòng)端事件我們通過DOM2級(jí)進(jìn)行綁定
/*div.ontouchstart=function(){
this.innerText +="手指按下";
}*/
//div.addEventListener(事件名稱(不加on),執(zhí)行函數(shù),是否捕獲)
//div.attachEvent(事件名稱(加on),執(zhí)行函數(shù))
div.addEventListener("touchstart",function(){
this.innerText="手指按下";
},false)
</script>
</body>
</html>
移動(dòng)端事件監(jiān)聽
者:kyrieliu
轉(zhuǎn)發(fā)鏈接:https://mp.weixin.qq.com/s/h0rwZr7FDPpE30TxlF5lZw
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。