JavaScript 事件(六)

腳本響應事件的方式, 通常是更新 web 頁面內(nèi)容

交互操作創(chuàng)建事件 --> 事件觸發(fā)代碼 --> 代碼反饋信息給用戶

UI 事件

當與瀏覽器 UI 本身交互時發(fā)生的事件

load - Web 頁面加載完成
unload - Web 頁面正在卸載
error - 瀏覽器遇到 JS 錯誤或不存在的資源
resize - 瀏覽器窗口的大小發(fā)生變化
scroll - 用戶使用滾動條移動了頁面

鍵盤事件

當用戶操作鍵盤時發(fā)生

keydown - 用戶第一次按下一個鍵(按住這個鍵時會反復觸發(fā))
keyup - 用戶松開了一個鍵
keypress - 輸入一個字符

//例:表單鍵入并直接顯示

var el;                                                    // Declare variables

function charCount(e) {                                    // Declare function
 var textEntered, charDisplay, counter, lastkey;          // Declare variables
 textEntered = document.getElementById('message').value;  // User's text
 charDisplay = document.getElementById('charactersLeft'); // Counter element
 counter = (180 - (textEntered.length));                  // Num of chars left
 charDisplay.textContent = counter;                       // Show chars left
 lastkey = document.getElementById('lastKey');            // Get last key elem
 lastkey.textContent = 'Last key in ASCII code: ' + e.keyCode; // Create msg 
}

el = document.getElementById('message');                   // Get msg element
el.addEventListener('keyup', charCount, false); // on keyup - call charCount()
鼠標事件

當用戶操作鼠標或觸控屏幕

click - 單擊一個元素
dblclick - 雙擊一個元素
mousedown - 在一個元素上按下
mouseup - 在一個元素上松開
mousemove - 移動鼠標(不會發(fā)生在觸屏上)
mouseover - 鼠標移到一個元素上(不會發(fā)生在觸屏上)
mouseout - 鼠標在一個元素上移開(不會發(fā)生在觸屏上)

var msg = '<div class=\"header\"><a id=\"close\" href="#">close X</a></div>';
msg += '<div><h2>System Maintenance</h2>';
msg += 'Our servers are being updated between 3 and 4 a.m. ';
msg += 'During this time, there may be minor disruptions to service.</div>';

var elNote = document.createElement('div');       // Create a new element
elNote.setAttribute('id', 'note');                // Add an id of note
elNote.innerHTML = msg;                           // Add the message
document.body.appendChild(elNote);                // Add it to the page

function dismissNote() {                          // Declare function
 document.body.removeChild(elNote);              // Remove the note
}

var elClose = document.getElementById('close');   // Get the close button
elClose.addEventListener('click', dismissNote, false);// Click close-clear note
焦點事件

當一個元素得到或失去一個焦點時

focus/focusin - 元素得到焦點
blur/focusout - 元素失去焦點

function checkUsername() {                        // Declare function
 var username = el.value;                        // Store username in variable
 if (username.length < 5) {                      // If username < 5 characters
   elMsg.className = 'warning';                  // Change class on message
   elMsg.textContent = 'Not long enough, yet...';// Update message
 } else {                                        // Otherwise
   elMsg.textContent = '';                       // Clear the message
 }
}

function tipUsername() {                          // Declare function
 elMsg.className = 'tip';                        // Change class for message
 elMsg.innerHTML = 'Username must be at least 5 characters'; // Add message
}

var el = document.getElementById('username');     // Username input
var elMsg = document.getElementById('feedback');  // Element to hold message

// When the username input gains / loses focus call functions above:
el.addEventListener('focus', tipUsername, false); // focus call tipUsername()
el.addEventListener('blur', checkUsername, false);// blur call checkUsername()
表單事件

當用戶與表單元素發(fā)生交互時

input - 輸入框元素中發(fā)生了變化
change - 選框按鈕發(fā)生變化
submit - 用戶提交表單
reset - 用戶點了表單上的重置按鈕(少用)
cut - 用戶從表單中剪切了內(nèi)容
copy - 用戶從表單中復制了內(nèi)容
paste - 用戶向表單中粘貼了內(nèi)容
selet - 用戶在表單中選中了一些文本

//表單提示和檢查代碼示例:
//HTML 例:
<!DOCTYPE html>
<html>
 <head>
   <title>JavaScript &amp; jQuery - Chapter 6: Events - Form Events</title>
   <link rel="stylesheet" href="css/c06.css" />
 </head>
 <body>
   <div id="page">
     <h1>List King</h1>
     <form method="post" action="http://www.example.org/register" id="formSignup">
       <h2>Membership</h2>

       <label for="package" class="selectbox"> Select a package: </label>
       <select id="package">
         <option value="annual">1 year ($50)</option>
         <option value="monthly">1 month ($5)</option>
       </select>
       <div id="packageHint" class="tip"></div>

       <input type="checkbox" id="terms" />
       <label for="terms" class="checkbox"> Check to agree to terms &amp; conditions</label>
       <div id="termsHint" class="warning"></div>

       <input type="submit" value="next" />

       </form>
     </div>
     <script src="js/form.js"></script>
   </body>
</html>


//JS 例:
var elForm, elSelectPackage, elPackageHint, elTerms, elTermsHint; // Declare variables
elForm          = document.getElementById('formSignup');          // Store elements
elSelectPackage = document.getElementById('package');
elPackageHint   = document.getElementById('packageHint');
elTerms         = document.getElementById('terms');
elTermsHint     = document.getElementById('termsHint');

function packageHint() {                                 // Declare function
 var pack = this.options[this.selectedIndex].value;     // Get selected option
 if (pack === 'monthly') {                              // If monthly package
   elPackageHint.innerHTML = 'Save $10 if you pay for 1 year!';//Show this msg
 } else {                                               // Otherwise
   elPackageHint.innerHTML = 'Wise choice!';            // Show this message
 }
}

function checkTerms(event) {                             // Declare function
 if (!elTerms.checked) {                                // If checkbox ticked
   elTermsHint.innerHTML = 'You must agree to the terms.'; // Show message
   event.preventDefault();                              // Don't submit form
 }
}

//Create event listeners: submit calls checkTerms(), change calls packageHint()
elForm.addEventListener('submit', checkTerms, false);
elSelectPackage.addEventListener('change', packageHint, false);

事件如何觸發(fā) JavaScript 代碼

事件處理三步驟:

  • 一. 獲取觸發(fā)事件的 DOM 節(jié)點
  • 二. 將事件綁定到 DOM 節(jié)點

1.傳統(tǒng)的 DOM 事件處理

element.onevent = functionName;      //目標函數(shù)節(jié)點.事件帶"on"前綴 = 調(diào)用的函數(shù)名(后面不帶小括號)

//例:
function checkUsername() {
 //事件的函數(shù)代碼
}

var el = document.getElementById('username');
el.onblur = checkUsername;

2.DOM 監(jiān)聽器

element.addEventListener('event', functionName [, Boolean]);      
//元素.時間選擇器(事件"無on前綴", 函數(shù)代碼, 事件流"一般為 false")

//例:
function checkUsername() {
 //事件的函數(shù)代碼
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

3.如何向事件中的函數(shù)傳參

//需要將事件函數(shù)封裝在匿名函數(shù)中
el.addEventListener(
   'blur',
   function() {
       checkUsername(5);
   },
   false
);
  • 三. 編寫事件需要自行的的函數(shù)(有名或匿名)

事件對象

可獲取事件的信息, 以及發(fā)生在哪個元素上

  • 屬性
    target -事件的目標元素
    type - 事件的類型
    cancelabel - 是否可撤銷事件在這個元素上的默認行為
  • 方法
    preventDefault() - 撤銷這個事件的默認行為
    stopPropagation() - 停止事件繼續(xù)冒泡或向下捕獲的過程
//使用事件對象例:

---
//無參數(shù)事件
function checkUsername(e) {
   var target = e.target;
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

---
//帶參數(shù)的事件
function checkUsername(e, minLength) {
   var target = e.target;
}

var el = document.getElementById('username');
el.addEventListener(
   'blur',
   function() {
       checkUsername(e, 5);
   },
   false
);

事件委托

為大量元素創(chuàng)建監(jiān)聽事件會影響頁面速度, 所以使用事件流在父元素上監(jiān)聽事件.

//HTML:
<div id="page">
  <h1>List King</h1>
  <h2>Buy groceries</h2>
  <ul id="shoppingList">
    <li class="complete"><a href="itemDone.php?id=1"><em>fresh</em> figs</a></li>
    <li class="complete"><a href="itemDone.php?id=2">pine nuts</a></li>
    <li class="complete"><a href="itemDone.php?id=3">honey</a></li>
    <li class="complete"><a href="itemDone.php?id=4">balsamic vinegar</a></li>
  </ul>
</div>

//JS例:
function itemDone(e) {
  var target, elParent, elGrandparent;
  target = getTarget(e);
  elParent = target.parentNode;
  elGrandparent = target.parentNode.parentNode;
  elGrandparent.removeChild(elParent);
  e.preventDefault;
}

var el = document.getElementById('shoppingList');
el.addEventListener('click', function(e){
  itemDone(e);
}, false)

this 關(guān)鍵字指向函數(shù)的所有者

當沒有參數(shù)傳遞給函數(shù)時, 常常使用 this 作為溝通

function checkUsername(){
  var elMsg = document.getElementById('feedback');
  if (this.value.length < 5) { 
    elMsg.innerHTML = 'Not long enough';
   } else {
    elMsg.innerHTML = ' ';
  }
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

如果需要往函數(shù)傳遞參數(shù),那么this 關(guān)鍵字就會失效

因為這個函數(shù)的所有者不再是監(jiān)聽器所綁定的元素, 而是那個匿名函數(shù)

function checkUsername(el, minLength) {
  var elMsg = document.getElementById('feedback')
  if (el.value.length < minLength) {
    elMsg.innerHTML = 'Not long enough';
  } else {
    elMsg.innerHTML = ' ';
  }
}

var el = document.getElementById('username');
el.addEventListener('blur', function(){
  checkUsername(el, 5);
}, false);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆惧,一起剝皮案震驚了整個濱河市狸页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扯再,老刑警劉巖芍耘,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叔收,居然都是意外死亡齿穗,警方通過查閱死者的電腦和手機傲隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門饺律,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跺株,你說我怎么就攤上這事复濒。” “怎么了乒省?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵巧颈,是天一觀的道長。 經(jīng)常有香客問我袖扛,道長砸泛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任蛆封,我火速辦了婚禮唇礁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惨篱。我一直安慰自己盏筐,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布砸讳。 她就那樣靜靜地躺著琢融,像睡著了一般界牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漾抬,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天宿亡,我揣著相機與錄音,去河邊找鬼纳令。 笑死她混,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的泊碑。 我是一名探鬼主播坤按,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馒过!你這毒婦竟也來了臭脓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腹忽,失蹤者是張志新(化名)和其女友劉穎来累,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窘奏,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡嘹锁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了着裹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片领猾。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骇扇,靈堂內(nèi)的尸體忽然破棺而出摔竿,到底是詐尸還是另有隱情,我是刑警寧澤少孝,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布继低,位于F島的核電站,受9級特大地震影響稍走,放射性物質(zhì)發(fā)生泄漏袁翁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一婿脸、第九天 我趴在偏房一處隱蔽的房頂上張望粱胜。 院中可真熱鬧,春花似錦盖淡、人聲如沸年柠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冗恨。三九已至答憔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掀抹,已是汗流浹背虐拓。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傲武,地道東北人蓉驹。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像揪利,于是被迫代替她去往敵國和親态兴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品疟位,去做同樣的事情瞻润,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,777評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象甜刻,但只有一個實例绍撞,加載時并不主動創(chuàng)建,需要時才創(chuàng)建 最常見的單例模式得院,...
    Obeing閱讀 2,076評論 1 10
  • 問答 一祥绞、dom對象的innerText和innerHTML有什么區(qū)別非洲? innerTextinnerText是一...
    婷樓沐熙閱讀 409評論 0 0
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容就谜。關(guān)于...
    云之外閱讀 5,052評論 0 29
  • 一支蘆葦 搖曳在池里 風來 拔韌著你的根蒂 無意像浮萍 綠的嬌艷 卻隨波浮沉淡起 一支蘆葦 搖曳在池里 雨來 滌蕩...
    素心微涼閱讀 239評論 0 3