1. 程式人生 > >淺談JavaScript的事件(事件類型)

淺談JavaScript的事件(事件類型)

元素 滾動 鍵盤 合成 html 另一個 date mov 焦點事件

  Web瀏覽器能夠發生的事件有很多種類型,不同的事件類型有不同的事件信息。DOM3級的事件類型主要包括:UI事件,用戶與頁面上的元素交互時觸發;焦點事件,元素獲得或失去焦點觸發;鼠標事件,用戶通過鼠標在頁面上執行操作時觸發;滾輪事件,使用鼠標滾輪時觸發;文本事件,當在文檔中輸入文本時觸發;鍵盤事件,用戶通過鍵盤在頁面上操作觸發;合成事件,當為IME輸入字符時觸發;變動事件,底層DOM結構發生變化時觸發。

  • UI事件

  UI事件的觸發並不一定是由用戶操作觸發的,包括:load,頁面完全加載後在window上觸發該事件、當所有框架都加載完畢時觸發、當圖片加載完畢時在img上觸發、當嵌入的元素加載完成時在object上面觸發;unload事件,當頁面完全卸載後在window上面觸發、當所有框架都卸載完成時在框架集上觸發、當嵌入的內容卸載完畢後在object上觸發;abort事件,在用戶停止下載過程時,如果嵌入的內容未加載完成,則在object上面觸發;error事件,當發生JavaScript腳本錯誤時觸發,當無法加載圖像時,在img元素上觸發,當無法加載嵌入內容時在object上觸發,當框架無法加載時觸發;select事件,當用戶選擇文本框的內容時觸發;resize事件,當瀏覽器窗口大小改變時觸發;scroll事件,當用戶滾動帶滾動條的元素時觸發。

1 EventUtil.addEvent(window,"load",function(){
2                 console.log(document.getElementById("aa").innerHTML);//2223             });

  上面的代碼添加了load事件,當頁面加載完成後就會觸發該事件。使用load事件能夠確保事件是在頁面元素加載完成後觸發,不活出現錯誤。如果我們在頁面元素位加載完成,就去獲取頁面上的元素,則會產生錯誤。

  

1 var img=document.getElementById("imgtest");
2             EventUtil.addEvent(img,"load",function
(event){ 3 event=EventUtil.getEvent(event);4 console.log(event.currentTarget.src); 5 });

  上面的代碼在img的圖片加載完成後,會觸發load事件,在load事件中,我們獲取了event對象,並通過event對象的屬性currentTarget取得了事件處理程序操作的元素。

1 var sc = document.createElement("script");
2             sc.src="js/checkboxdemo.js";
3 EventUtil.addEvent(sc,"load",function(event){ 4 console.log("loaded"); 5 }); 6 document.head.appendChild(sc);

  上面的代碼,動態向head添加腳本文件,並且綁定了load事件。

  unload事件是與load事件對立的一個事件,這個事件在完全卸載後觸發。當用戶從一個頁面切換到另一個頁面就會觸發該事件。需要註意的是,在unload事件中不能dom元素進行操作,因為當unload事件執行的時候,所有的頁面元素都已經不存在。

  當瀏覽器大小發生改變的時候會觸發resize事件。

1 EventUtil.addEvent(window,"resize",function(event){
2                 alert("resize");
3             });

  需要註意的是不要再resize中添加大量的計算代碼,因為在瀏覽器窗口改變的時候,resize事件會被頻繁的觸發,會影響瀏覽器的性能。

  • 焦點事件

  焦點事件會在頁面獲得或失去焦點時觸發。利用這些事件,並於document.hasFocus()方法和document.activeElement屬性配合,可以知曉用戶在頁面上的行為。有6個焦點事件:blur事件,元素失去焦點時觸發事件,不會冒泡;focus事件,元素獲得焦點時觸發,不會冒泡;focusin事件,元素獲得焦點時觸發,會冒泡;focusout事件,元素失去焦點時觸發,會冒泡。當用戶在頁面上由一個元素移動到另一個元素事件觸發的順序為:focusout事件,在失去焦點的元素上觸發;focusin事件,在獲得焦點的元素上觸發;blur事件,在失去焦點的元素上觸發;focus事件,在獲得焦點的元素上觸發。

  • 鼠標與滾輪事件  

  鼠標事件是WEB開發中最常用的事件。DOM3級中定義了9個鼠標事件:click事件,用戶單擊鼠標左鍵觸發的事件或者按下enter鍵觸發;dbclick事件,用戶雙擊鼠標左鍵的時候觸發;mousedown事件,用戶按下鼠標按鈕時觸發;mouseenter事件,用戶光標從元素外部首次移動到元素範圍之內觸發。這個事件不冒泡,而且光標在移動到後代元素上不會觸發;mouseleave事件,在位於元素上方的事件移動到元素範圍之外時觸發;mousemove事件,鼠標在元素內部移動時重復重復;mouseout事件,在鼠標指針位於一個元素上方然後用於將其移入另一個元素時觸發;mouseover事件,鼠標位於元素外部,然後用戶首次將其移入元素內部觸發;mouseup事件,釋放鼠標時觸發。

  只有在同一個元素上觸發mousedown和mouseup事件,才會觸發click事件。只有觸發兩次click事件,才會觸發dbclick事件。

 1 var img=document.getElementById("imgtest");
 2             EventUtil.addEvent(img,"mousedown",function(event){
 3                 console.log(event.type);
 4             });
 5             EventUtil.addEvent(img,"mouseup",function(event){
 6                 console.log(event.type);
 7             });
 8             EventUtil.addEvent(img,"click",function(event){
 9                 console.log(event.type);
10             });
11             EventUtil.addEvent(img,"dblclick",function(event){
12                 console.log(event.type);
13             });

  上面的代碼在img上註冊了mousedown、mouseup、click、dblclick事件。當雙擊img的時候,依次輸出:mousedown、mouseup、click、mousedown、mouseup、click、dblclick。

  鼠標滾輪事件就是mousewheel事件,這個事件跟蹤鼠標滾輪。

  

 1 EventUtil.addEvent(document.getElementById("imgtest"),"mousemove",function(event){
 2                 event=EventUtil.getEvent();
 3                 var pageX=event.pageX,
 4                 pageY=event.pageY;
 5                 if(!event.pageX){
 6                     pageX=event.clientX+(document.body.scrollLeft||document.documentElement.scrollLeft);
 7                 }
 8                 if(!pageY){
 9                     pageY=event.clientY+(document.body.scrollTop||document.documentElement.scrollTop);
10                 }
11                 console.log(pageX+","+pageY);
12             })

  上面的代碼能夠實時顯示鼠標的頁面位置信息。即使有了滾動條,依然能夠正確計算。

  • 鍵盤與文本事件

  用戶在使用鍵盤時會觸發鍵盤事件,有3個事件:keydown事件,當用戶按下鍵盤上任意鍵時觸發,如果按住不放會重復觸發此事件;keypress事件,當用戶按下鍵盤上的字符鍵時觸發,如果按住不放會重復觸發此事件;keyup事件,當釋放鍵盤上的鍵時觸發。

  用戶按下鍵盤上的字符鍵時,首先會觸發keydown事件,然後是keypress事件,最後觸發keyup事件。其中keydown和keypress是在文本框發生變化之前觸發,keyup是在文本框變化之後觸發。如果按下的是非字符集,則會觸發keydown和keyup事件。

  在發生keydown和keyup事件時,event對象的keyCode屬性會包含一個代碼,與鍵盤上一個特定的鍵對應。對數字字母字符集,keyCode的屬性值與ASCII碼中的小寫字母或數字的編碼相同。

1 EventUtil.addEvent(document.getElementById("inputtext"),"keyup",function(event){
2             event=EventUtil.getEvent(event);
3             console.log(event.keyCode);
4         })
  • 復合事件  

  復合事件是DOM3級中新增加的一類事件,用於處理IME的輸入序列。IME可以讓用戶輸入在鍵盤上找不到的字符。IME通常需要同時多個字符來確定一個字符,比如中文的輸入。包括3個事件:compositionstart事件,IME打開時觸發,表示要輸入了;compositionupdate事件,插入新字符時觸發;compositionend事件,在IME復合系統關閉時觸發,返回正常輸入狀態。

 1 var textbox=document.getElementById("inputtext");
 2         EventUtil.addEvent(textbox,"compositionstart",function(event){
 3             event=EventUtil.getEvent(event);
 4             console.log(event.data);
 5         });
 6         EventUtil.addEvent(textbox,"compositionupdate",function(event){
 7             event=EventUtil.getEvent(event);
 8             console.log(event.data);
 9         });
10         EventUtil.addEvent(textbox,"compositionend",function(event){
11             event=EventUtil.getEvent(event);
12             console.log(event.data);
13         });

淺談JavaScript的事件(事件類型)