JavaScript知識總結——事件(2)

Web 瀏覽器中可能發生的事件有很多類型。如前所述,不同的事件類型具有不同的信息,而 DOM3 級事件規定了以下幾類事件。

UI事件

當用戶與頁面上的元素交互時觸發;

  • 種類
    1.load,頁面完全加載完后在window上觸發,所有框架加載完畢后在框架集上觸發,圖像加載完畢在img元素上觸發,當嵌入內容加載完畢在object元素上觸發。
    2.unload,頁面完全卸載(window),所有框架都卸載后(框架集),嵌入內容卸載完畢后(object)。
    3.abort,當用戶停止下載過程,如果嵌入內容沒有加載完,則在object元素上除法。
    4.error,當js錯誤時(window),當無法加載圖像時(img),當無法加載嵌入內容時(object),當一或多個框架無法加載(框架集)。
    5.select,當用戶選擇文本框(texterea或input)中的一個或多個字符時觸發。
    6.resize:當窗口或框架的大小變化時(window或框架)
    7.scroll:當用戶滾動帶滾動條的元素中的內容時(在該元素上觸發)

焦點事件

當元素獲得或失去焦點時觸發;

  • 種類
    blur:元素失去焦點,不會冒泡;
    DOMFocusIn:同HTML事件focus,于DOM3遭廢棄,選用focusin;
    DOMFocusOut:同HTML事件blur,于DOM3遭廢棄,選用focusout;
    focus:元素獲得焦點,不回冒泡;
    focusin:獲得焦點,與HTML事件focus等價,但會冒泡;
    focusout:失去焦點,與HTML事件blur等價;
    -順序
    當焦點從頁面中的一個元素轉移到另一個元素會觸發下面的事件:
    focusout --> focusin --> blur --> DOMFocusOut --> focus --> DOMFocusIn
window.onfocus = function () {
  console.log('focus'); //focus
  console.log(document.hasFocus()); //True
}
window.onblur = function () {
  console.log('blur'); //blur
  console.log(document.hasFocus()); //False
}

鼠標事件

當用戶通過鼠標在頁面上執行操作時觸發;

  • 事件種類
    1.mousedown:鼠標按鈕被按下(左鍵或者右鍵)時觸發。不能通過鍵盤觸發。
    2.mouseup:鼠標按鈕被釋放彈起時觸發。不能通過鍵盤觸發。
    3.click:單擊鼠標左鍵或者按下回車鍵時觸發。這點對確保易訪問性很重要,意味著onclick事件處理程序既可以通過鍵盤也可以通過鼠標執行。
    4.dblclick:雙擊鼠標左鍵時觸發。
    5.mouseover:鼠標移入目標元素上方。鼠標移到其后代元素上時會觸發。
    6.mouseout:鼠標移出目標元素上方。
    7.mouseenter:鼠標移入元素范圍內觸發,該事件不冒泡,即鼠標移到其后代元素上時不會觸發。
    8.mouseleave:鼠標移出元素范圍時觸發,該事件不冒泡,即鼠標移到其后代元素時不會觸發。
    9.mousemove:鼠標在元素內部移到時不斷觸發。不能通過鍵盤觸發。
  • 事件觸發的順序
    mousedown => mouseup => click => mousedown => mouseup => click => dblclick
    mouseenter和mouseover的區別
    區別:
    mouseover事件會冒泡,這意味著,鼠標移到其后代元素上時會觸發。
    mouseenter事件不冒泡,這意味著,鼠標移到其后代元素上時不會觸發。
    ![mouseenter]
mouseover
  • 鼠標左鍵和右鍵
<script type="text/javascript">
document.onmousedown=function (ev)
{
    var oEvent=ev||event; //IE瀏覽器直接使用event或者window.event得到事件本身。
    alert(oEvent.button);// IE下鼠標的 左鍵是1 ,  右鍵是2   ff和chrome下 鼠標左鍵是0  右鍵是2
};
</script>
  • mouseover和mousemove的區別
    一般情況下mouseover即可,特殊情況才用mousemove,mousemove更耗資源,比如要監控鼠標坐標的變化等。

滾輪事件

當使用鼠標滾輪(或類似設備)時觸發;

  • 事件種類
    1.mousewheel:這個事件跟蹤鼠標滾輪,類似Mac的觸屏版。
  • 客戶區坐標位置
    鼠標事件都是在瀏覽器視口的特定位置上發生的。這個位置信息保存在事件對象的clientX和clientY屬性中。所有瀏覽器都支持者兩個屬性。clientX和clientY表示事件發生時鼠標指針在視口中的水平和垂直坐標。
document.addEventListener('click',function(event){
    document.title=event.clientX+' , '+event.clientY;
},false);

給document指定了onclick事件處理程序,單擊頁面時在title中可以看到客戶端的坐標信息。
注意:這些值中不包括頁面滾動的距離,因為這個位置并不表示鼠標在頁面上的位置。

  • 頁面坐標位置
    通過clientX和clientY能夠指定鼠標是在視口中聲明位置發生的,而頁面坐標通過事件對象的pageX和pageY屬性,能夠得到事件是在頁面中的什么位置發生的。即pageX和pageY表示鼠標光標在頁面中的位置,因此坐標是從頁面本身而非視口的左邊和頂邊計算的。
document.addEventListener('click',function(event){
    console.log(event.clientX+' , '+event.clientY);
    console.log(event.pageX+' , '+event.pageY);
},false);

在頁面沒有滾動的情況下,pageX和pageY的值與clientX和clientY的值相等。

IE8及更早版本不支持事件對象上的頁面坐標,不過使用客戶區坐標和滾動信息可以計算出來。這時候需要用到document.body(混雜模式)或document.documentElement(標準模式)中的scrollLeft和scrollTop屬性。如下:

<script type="text/javascript">
var div=document.getElementById("myDiv");
EventUtil.addHandler(div,"click",function(event){
    event=EventUtil.getEvent(event);
    var pageX=event.pageX,
          pageY=event.pageY;
    if(pageX==undefined)          {
        pageX=event.clientX+(document.body.scrollLeft || document.documentElement.scrollLeft);
    }
    if(pageY==undefined){
        pageY=event.clientY+(document.body.scrollTop || document.documentElement.scrollTop);
    }
    alert("Page coordinates:" +pageX+" , "+pageY);
});
</script>
  • 屏幕坐標位置
    鼠標事件發生時,不僅會有相對于瀏覽器窗口的位置,還有一個相對于整個電腦屏幕的位置。而通過screenX和screenY屬性就可以確定鼠標事件發生時鼠標指針相對于整個屏幕的坐標信息。
document.addEventListener('click',function(event){
    console.log("Client coordinates"+event.clientX+' , '+event.clientY);
    console.log("Page coordinates "+event.pageX+' , '+event.pageY);
    console.log("Screen coordinates "+event.screenX+' , '+event.screenY);
},false);
  • 修改鍵

文本事件

當在文檔中輸入文本時觸發;

  • 種類
    1.textInput:textInput是對keypress的補充,用意是在將文本顯示給用戶之前更容易攔截文本。在文本插入文本框之前會觸發textInput事件。
  • textInput詳細
    1.用戶在可編輯區域中輸入字符時,就會觸發這個事件。
    2.textInput用來代替keypress,二者區別:
    (1)任何可以獲得焦點的元素都可以觸發keypress事件,但只有可編輯區域才能觸發textInput事件。
    (2)textInput事件只會在用戶按下能夠輸入實際字符的鍵時才會觸發,而keypress事件則在按下那些能夠影響文本顯示的鍵時也會觸發(比如退格鍵)。
    3.data屬性
    textInput事件主要考慮的是字符,因此它的event對象中還包含一個data屬性,data值為用戶輸入的字符。
    (1)用戶按下S鍵,data值就是“s”
    (2)用戶按下上檔鍵時按下S鍵,data值就是"S"
    4.inputMethod屬性
    另外,event對象上還有一個屬性,叫inputMethod,表示文本輸入到文本框中的方式。使用這個屬性可以確定文本是如何輸入到控件中,從而驗證其有效性。
    0,表示瀏覽器不確定是怎么輸入的
    1,表示是使用鍵盤輸入的
    2,表示文本是粘貼進來的
    3,表示文本是拖放進來的
    4,表示文本是使用IME輸入的
    5,表示文本是通過在表單中選擇某一項輸入的
    6,表示文本是通過手寫輸入的(比如使用手寫筆)
    7,表示文本是通過語音輸入的
    8,表示文本是通過集中方法組合輸入的
    9,表示文本是通過腳本輸入的
    兼容性:支持textInput屬性的瀏覽器有IE9+,Safari和Chrome,只有IE支持inputMethod屬性。

鍵盤事件

當用戶通過鍵盤在頁面上執行操作時觸發;
當用戶按下一個鍵盤上的字符鍵時,首先會觸發keydown事件,然后緊跟著是keypress事件,最后會觸發keyup事件。
keydown和kepress都是在文本框發生變化之前觸發的,keyup事件則是在文本框已經發生變化之后觸發的。
如果用戶按下一個字符鍵不放,就會重復觸發keydown和keypress事件,直到用戶松開該鍵為止。
如果用戶按下的是一個非字符鍵,那么首先會觸發keydown事件,然后就是keyup事件。如果按住這個非字符鍵不放,那么就會一直重復觸發keydown事件,直到用戶松開這個鍵,此時會觸發keyup事件。

  • 種類
    1.keydown:當用戶按下鍵盤上的任意鍵時觸發,而且如果按住不放的話,會重復觸發此事件。
    2.keypress:當用戶按下鍵盤上的字符鍵時觸發,而且如果按住不放的話,會重復觸發此事件。
    3.keyup:當用戶釋放鍵盤上的鍵時觸發。
  • 鍵碼
    keydown和keyup事件發生時,evnet對象的keyCode屬性中會包含一個代碼,與鍵盤上一個特定的鍵對應。
var textbox=document.getElementById("myText");
EventUtil.addHandler(textbox,"keyup",function(event){
    event=EventUtil.getEvent(event);
    console.log(event.keyCode);
}); 

兼容性:在Firefox和Opera中,按分號鍵時keyCode值為59,也就是ASCII中分號的編碼;但IE和Safari返回186,即鍵盤中按鍵的鍵碼。
鍵碼表:http://www.cnblogs.com/wuhua1/p/6686237.html

  • 字符編碼
    IE9,Firefox,Chrome和Safari的event對象支持charCode 屬性,charCode只有發生keypress事件時才包含值,該值是按下那個鍵所代表字符的ASCII編碼。
    兼容性:
    IE8及之前版本中Opera是在keyCode中保存字符的ASCII編碼。
    檢查charCode屬性是否可用,不可用則使用keyCode。
getCharCode:function(event){
    if(typeof event.charCode=="number"){//在不支持的瀏覽器中值是undefined
        return event.charCode;
    }else{
        return event.keyCode;
    }
}

在取得了字符編碼之后,就可以使用String.fromCharCode()將其轉換成實際的字符。

  • DOM3級變化
    DOM3中鍵盤事件不再包含charCode,而是包含2個新屬性:key和char。
    key是為了取代keyCode新增的,它的值是一個字符串。按下字符鍵(比如"M"),key的值就是相應的文本字符"M";按下非字符鍵時,key的值就是相應的鍵名(比如"Shift"或“Down”)。
    char屬性在按下字符鍵時行為與key相同,但在按下非字符鍵時值為null。
    存在兼容性,不推薦用。

觸摸事件

  • 種類
    1.touchstart:當手指觸摸屏幕時觸發;即使已經有一個手指放在了屏幕上也會觸發。
    2.touchmove:當手指在屏幕上滑動時連續地觸發。在這個世界發生期間,調用preventDefault()可以阻止滾動。
    3.touchend:當手指在屏幕上移開時觸發。
    4.touchcancel:當系統停止跟蹤觸摸時觸發。關于此事件的確切觸發時間,文檔中沒有明確說明。
    上面這幾個事件都會冒泡,也都可以取消。雖然這些觸摸事件沒有在DOM規范中定義,但它們卻是以兼容DOM的方式實現的。因此,每個觸摸事件的event對象都提供了鼠標事件中常見的屬性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。
  • 屬性
    每個Touch對象包含下列屬性:
    clientX:觸摸目標在視口中的x坐標。
    clientY:觸摸目標在視口中的y坐標。
    identifier:標識觸摸的唯一ID。
    pageX:觸摸目標在頁面中的x坐標。
    pageY:觸摸目標在頁面中的y坐標。
    screenX:觸摸目標在屏幕中的x坐標。
    screenY:觸摸目標在屏幕中的y坐標。
    target:觸摸的DOM節點目標。
    除了常見的DOM屬性外,觸摸世界還包含下列三個用于跟蹤觸摸的屬性。
    touches:表示當前跟蹤的觸摸操作的Touch對象的數組。
    targetTouches:特定于事件目標的Touch對象的數組。
    changedTouches:表示字上次觸摸以來發生了什么改變的Touch對象的數組。
    使用這些屬性可以跟蹤用戶對屏幕的觸摸操作。
function handlerTouchEvent(event){
    //只跟蹤一次觸摸
    if(event.touches.length==1 || event.touches.length==0){//書上這里有錯
        var output=document.getElementById("output");
        switch(event.type){
            case "touchstart":
                output.innerHTML="Touch started ( "+event.touches[0].clientX+", "+event.touches[0].clientY+")";
                break;
            case "touchend":
                output.innerHTML+="<br/>Touch ended ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";
                break;
            case "touchmove":
                event.preventDefault(); //阻止滾動
                output.innerHTML+="<br/>Touch moved ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";
        }
    }
}

EventUtil.addHandler(document,"touchstart",handlerTouchEvent);
EventUtil.addHandler(document,"touchend",handlerTouchEvent);
EventUtil.addHandler(document,"touchmove",handlerTouchEvent);

315302-20170317110948354-1520843247.png

以上代碼會跟蹤屏幕上發生的一次觸摸操作。為簡單起見,只會在有一次活動觸摸操作的情況下輸出信息。
當touchstart事件發生時,會將觸摸的位置信息輸出到<div>元素中。
當touchmove事件發生時,會取消其默認行為,阻止滾動(觸摸移動的默認行為是滾動頁面),然后輸出觸摸操作的變化信息。
而touched事件則會輸出有關觸摸操作的最終信息。
注:在touched事件發生時,touches集合中就沒有任何Touch對象了,因為不存在活動的觸摸操作;此時,就必須轉而使用changedTouches集合。

/當觸發touchstart和touchmove事件的時候沒有問題,程序能正確的進入 if 然后根據case執行對應的語句,但是當觸發touchend事件的時候,event.touches.length已經等于0了,不能再進入if 中,也就不能執行case中的語句,所以觸發touchend的時候永遠不會執行程序。所以判斷條件要加上 event.touches.length==0./

  • 觸發順序
    touchstart => mouseover => mousemove(一次) => mousedown => mouseup => click => touched

手勢事件

當兩個手指觸摸屏幕時就會產生手勢,手勢通常會改變顯示項的大小,或者旋轉顯示項。有三個手勢事件,

  • 種類
    1.gesturestart:當一個手指已經按在屏幕上而另一個手指又觸摸屏幕時觸發。
    2.gesturechange:當觸摸屏幕的任何一個手指的位置發生變化時觸發。
    3.gestureend:當任何一個手指從屏幕上移開時觸發。
  • 觸摸事件和手勢事件關系
    每個手勢事件的event對象都包含著標準的鼠標事件屬性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。此外還有兩個額外的屬性:rotation和scale。
    1.rotation屬性:表示手指變化引起的旋轉角度,負值表示逆時針旋轉,正值表示順時針旋轉(該值從0開始)。
    2.scale屬性:表示兩個手指間距離的變化情況(例如向內收縮會縮短距離);這個值從1開始,并隨距離拉大而增長,隨距離縮短而減小。
    注:
    (1)只有兩個手指都觸摸到事件的接收容器時才會觸發這些事件。
    (2)在一個元素上設置事件處理程序,意味著兩個手指必須同時位于該元素的范圍之內,才能觸發手勢事件(這個元素就是目標)。
    (3)由于這些事件冒泡,所以講事件處理程序放在文檔上也可以處理所有手勢事件。
    (4)此時,事件的目標就算兩個手指都位于其范圍內的那個元素。
    例子:
function handleGestureEvent(event){
   var output=document.getElementById("output");
    switch(event.type){
         case "gesturestart":
                output.innerHTML="Gesture started ( "+event.ratation+", scale"+event.scale+")";
                break;
            case "gestureend":
                output.innerHTML+="<br/>Gesture ended ("+event.rotation+", scale"+event.scale+")";
                break;
            case "gesturechange":
                event.preventDefault(); //阻止滾動
                output.innerHTML+="<br/>Gesture changed ("+event.rotation+",scale "+event.scale+")";
    }
}
EventUtil.addHandler(document,"gesturestart",handleGestureEvent);
EventUtil.addHandler(document,"gestureend",handleGestureEvent);
EventUtil.addHandler(document,"gesturechange",handleGestureEvent);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 1、窗體 1、常用屬性 (1)Name屬性:用來獲取或設置窗體的名稱,在應用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調閱讀 4,579評論 0 11
  • 之前寫過一篇瀏覽器事件的相關操作和事件運行的原理——JavaScript瀏覽器事件解析。這一篇主要寫一些常用的事件...
    faremax閱讀 1,641評論 0 0
  • 事件流 IE和Netscape開發團隊提出了完全相反的兩種事件流的概念,事件冒泡流和事件捕獲流。 事件冒泡 事件由...
    exialym閱讀 952評論 0 9
  • 13.1 事件流 “DOM2級事件”規定事件流包括3個階段:事件捕獲階段,處于目標階段,事件冒泡階段。事件捕獲表示...
    Elevens_regret閱讀 440評論 0 0
  • #與孩子一起成長,做更好的自己# 孩子第二個30天目標:適應日托班的生活,睡覺能獨立入睡,認真刷牙。 媽媽第二個3...
    yi_jing830閱讀 122評論 0 0