DOM——事件詳解


事件

事件:觸發-響應機制。

事件就是文檔或瀏覽器窗口中發生的一些特定的交互瞬間。

事件三要素

  • 事件源:觸發(被)事件的元素

  • 事件名稱: click 點擊事件

  • 事件處理程序:事件觸發后要執行的代碼(函數形式)

事件的基本使用

 var box = document.getElementById('box');
 box.onclick = function() {
   console.log('代碼會在box被點擊后執行');  
 };

案例

  • 點擊按鈕彈出提示框

  • 點擊按鈕切換圖片

事件詳解

HTML事件

直接在HTML元素標簽內添加事件,來執行腳本。

 

 

 

 

 

 

 

 DOM0級事件

如果要給多個元素綁定事件,采用HTML的方式綁定,每個元素都要在標簽內寫好綁定事件,這樣十分麻煩,也不利於維護,因此我們可以通過DOM0級事件的方式來為元素綁定事件,先獲取DOM元素,再在元素上綁定事件。

注意!調用時,函數名后面不要加括號!如果加了括號,事件被觸發前就執行。

 

 

 

 

 

 

 

 

 

 案例

根據效果圖,實現以下功能:

(1)當點擊“錄入”按鈕時,循環彈出“請輸入員工姓名”的輸入框,每次錄入一個員工的姓名。

(2)直到用戶輸入-1時,才停止彈出輸入框,然后將用戶輸入的信息輸出在頁面上。

效果圖如下:

http://img1.sycdn.imooc.com\/climg/59c0d0ef0001365105000188.jpg

思路

一系列代碼需要在entryFn()方法中進行編寫:

(1)  定義一個新數組,保存用戶輸入的所有信息,var arr=new Array();

(2)  定義一個變量,接收用戶每一次輸入的信息,var input;

(3) 使用while循環,循環彈出輸入框,直到用戶輸入-1,則停止彈出;同時,需要把彈出框中獲取到的內容放到第一步定義的數組中。

//img1.sycdn.imooc.com/climg/5e0881c429c70c2405001000.jpg

(4)  用戶在輸入框中輸入的每一個信息,都被放進了新建的數組中,除了結束符-1,所以需要去除數組的最后一項,運用arr.pop();方法去除。

(5) 使用for循環,將用戶輸入的信息依次顯示在頁面中,注意i要+1,因為下表是從0開始的:

//img1.sycdn.imooc.com/climg/5d4f8dc3000133f005000056.jpg

我的代碼

鼠標事件

 

 

 

onload 

onload 事件會在頁面或圖像加載完成后立即發生。

 

 

 

 

 

案例

補充下面的代碼,實現以下功能:

(1)   當點擊按鈕時,按鈕的字體顏色變成紅色

(2)   當鼠標離開按鈕時,字體顏色變成灰色

注意,把js腳本寫在<head>標簽中。

效果圖如下:

http://img1.sycdn.imooc.com\/climg/59c0d1f5000100f305000243.jpg

思路

第一步:定義onload方法,並把所有的js代碼放到onload方法中。

第二步:通過元素獲取dom對象的方式獲取到按鈕元素

第三步:按鈕綁定點擊事件,當點擊按鈕時,按鈕的字體顏色變為紅色

第四步:按鈕再綁定鼠標離開事件,當鼠標離開按鈕時,按鈕的字體顏色變為灰色

 我的代碼

onfocus &onblur

 編程練習

根據效果圖,補充代碼,實現下列功能:

(1)當輸入框獲得焦點:

如果輸入框值為空,提示“請輸入您的姓名”

(2)當輸入框失去焦點:

如果輸入框值為空,提示“用戶名不能為空”,並且邊框顏色變為紅色

如果輸入框值不為空,那么沒有提示文字,邊框顏色是默認顏色

效果圖如下:

http://img1.sycdn.imooc.com\/climg/59c0d2f700018d1d05000199.jpg

思路

根據gif效果圖完成下列步驟:

第一步:通過元素名獲取dom對象的方式,得到輸入框對象以及放置提示文字的元素對象,並用變量進行接收

第二步:給輸入框綁定獲得焦點事件,當輸入框獲得焦點時,判斷:

如果值為空,輸入框后出現提示文字“請輸入您的姓名”

第三步:給輸入框綁定失去焦點事件,當輸入框獲得焦點時,判斷:

(1)如果值為空,輸入框后出現提示文字“用戶名不能為空”,並且將樣式表中的邊框樣式添加給輸入框

(2)如果值不為空,輸入框后的提示文字消失,之前加上的樣式也要去掉

Tips:

(1)  在第三步的判斷中,如果值為空,給輸入框加上顏色,那么當我們輸入框獲取焦點時,要將邊框樣式恢復默認樣式

(2)用設置元素的class屬性這個方法給輸入框加樣式,用到的是className屬性給class添加值,比如this.className="red";

 我的代碼

onchange

給菜單綁定change事件,一般作用於select或checkbox或radio。

編程練習 

根據效果圖,補充代碼,使用onchange事件實現下列功能:

(1)選擇下拉列表中不同的選項,頁面中的div就設置成不同的背景顏色,div中的內容也發生變化。 比如:選擇黃色選項,div的背景顏色就變為黃色,文本內容就變為“我的背景顏色變成了yellow色”

(2)當選擇下拉列表中的“請選擇”時,div的背景顏色變成白色,文本變為“我沒有發生任何變化”

效果圖如下:

http://img1.sycdn.imooc.com\/climg/58326dd60001766205000413.jpg

思路

第一步:定義onload事件,所有的js代碼都放到onload方法中。

第二步: 通過id獲取元素的方式得到下拉列表對象和div元素對象

第三步: 給下拉列表綁定選項發生變化時觸發的事件(onchange事件),在事件中需要判斷:

(1)如果下拉列表的value值是0時,div的背景顏色設置為白色,文本內容設置為“我沒有發生任何變化”

(2)div的背景顏色與下拉列表的value值一致,文本內容隨之變化為:“我的背景顏色變成了…”,注意這里需要拼接字符串。

我的代碼

 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>onchange()</title>
 6         <style type="text/css">
 7             #div{
 8                 width:300px;
 9                 height:300px; 
10                 border:2px solid gray;
11                 margin:100px  0  0 200px;
12             }
13         </style>
14         <script type="text/javascript">
15            //補充代碼
16            window.onload=function(){
17                var select = document.getElementById("color");
18                var div = document.getElementById("div");
19                select.onchange=function(){
20                    if(this.value == 0){
21                        div.innerHTML="我沒發生任何變化";
22                        div.style.background="white";
23                    }else{
24                        div.innerHTML="我的背景顏色變成了"+this.value+"";
25                        div.style.background=this.value;
26                    }
27                }
28            } 
29         </script> 
30     </head>
31     <body>
32         <div>
33             <span>請選擇您喜歡的顏色:</span>
34             <select id="color">
35                 <option value="0">請選擇</option>
36                 <option value="yellow">黃色</option>
37                 <option value="orange">橘色</option>
38                 <option value="pink">粉色</option>
39                 <option value="purple">紫色</option>
40             </select>
41         </div>
42         <div id="div">我是div</div>
43  </body>
44 </html>
45  

onsubmit

表單中的確認按鈕被點擊時發生。

onmousedownonmousemoveonmouseup

鼠標按下 & 鼠標移動 & 鼠標按下后松開

常用於拖動元素時綁定事件。

onresize

調整瀏覽器窗口大小時觸發

onscroll

拖動滾動條時觸發(瀏覽器窗口或某個元素的滾動條)

編程練習

根據下面的效果演示,補充代碼,實現下列功能:

(1)  當鼠標在帶滾動條的文本框上滑動時,字體顏色變成紅色

(2)  當鼠標移出帶滾動條的文本框時,字體顏色變成綠色

(3)  當鼠標移動文本框的滾動條時,空白的文本框出現文本“內容滾動了”

http://img1.sycdn.imooc.com\/climg/59c0d7ef00013a0d03110469.jpg

思路

第一步:通過id選取元素的方式分別獲取這兩個文本框

//img1.sycdn.imooc.com/climg/5d4fe1240001b9c905000047.jpg

第二步:給帶滾動條的文本框綁定事件

(1)綁定拖動滾動條時觸發的事件,當滾動條被拖動時,空白文本框出現文本“內容滾動了”

//img1.sycdn.imooc.com/climg/5d4fe0f80001760804240079.jpg

(2)綁定鼠標移動時觸發的事件,當鼠標在帶滾動條的文本框上移動時,帶滾動條的文本框字體顏色變為紅色

//img1.sycdn.imooc.com/climg/5d4fe1000001731303470077.jpg

(3)綁定鼠標離開時觸發的事件,當鼠標在離開帶滾動條的文本框時,帶滾動條的文本框字體顏色變為綠色

//img1.sycdn.imooc.com/climg/5d4fe10b0001110503430076.jpg

 我的代碼

 鍵盤事件與keycode屬性

 

編程練習

根據效果圖,補充下面的代碼,

實現:

(1)在文本域中輸入文本,文本域的字數限制在30個字以內。

(2)每當用戶輸入一個字,就要提示還能輸入多少個字

(3)當用戶輸入的文本超出了30個字時,要提示用戶超出了多少字

思路 

第一步:獲取到文本域對象、字數變化元素、字數超過限制提示標簽

第二步:自定義一個變量,接收可輸入的總字數(30)

第三步:給文本域綁定按鍵被松開時的事件,后跟匿名函數,以下步驟均在函數中

第四步:自定義變量,用於接收按鍵每松開一次獲取一次文本域的值的長度

第五步:自定義變量,用於接收可輸入的字體個數,b標簽中的文本內容設置為該變量

第六步:判斷,如果可輸入的字數小於0,span標簽的內容要設置為“已超出多少字”

我的代碼

 

 注意:獲取文本框中文本用value而不是innerHTML·····

 

 

關於this指向

 在事件觸發的函數中,this是對該DOM對象的引用。

注冊/移除事件的三種方式

 var box = document.getElementById('box');
 box.onclick = function () {
   console.log('點擊后執行');
 };
 box.onclick = null;
 
 box.addEventListener('click', eventCode, false);
 box.removeEventListener('click', eventCode, false);
 
 box.attachEvent('onclick', eventCode);
 box.detachEvent('onclick', eventCode);
 
 function eventCode() {
   console.log('點擊后執行');
 }

兼容代碼

 function addEventListener(element, type, fn) {
   if (element.addEventListener) {
     element.addEventListener(type, fn, false);
  } else if (element.attachEvent){
     element.attachEvent('on' + type,fn);
  } else {
     element['on' + type] = fn;
  }
 }
 
 function removeEventListener(element, type, fn) {
   if (element.removeEventListener) {
     element.removeEventListener(type, fn, false);
  } else if (element.detachEvent) {
     element.detachEvent('on' + type, fn);
  } else {
     element['on'+type] = null;
  }
 }

事件的三個階段

  1. 捕獲階段

  2. 當前目標階段

  3. 冒泡階段

    事件對象.eventPhase屬性可以查看事件觸發時所處的階段

事件對象的屬性和方法

  • event.type 獲取事件類型

  • clientX/clientY 所有瀏覽器都支持,窗口位置

  • pageX/pageY IE8以前不支持,頁面位置

  • event.target || event.srcElement 用於獲取觸發事件的元素

  • event.preventDefault() 取消默認行為

案例

  • 跟着鼠標飛的天使

  • 鼠標點哪圖片飛到哪里

  • 獲取鼠標在div內的坐標

阻止事件傳播的方式

  • 標准方式 event.stopPropagation();

  • IE低版本 event.cancelBubble = true; 標准中已廢棄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM