JavaScript-高級篇之事件

  1. 什么是事件
  2. 掌握事件流
  3. 掌握DOM事件流與IE事件處理程序
  4. 掌握跨瀏覽器的事件處理程序
  5. 掌握event對象的常用屬性及方法
  6. 掌握常用的事件類型

事件

事件是可以被JavaScript偵測到的行為,通俗的講就是當用戶與Web頁面進行某些交互時,解釋器就會創(chuàng)建響應的event對象以描述事件信息

事件定義

一共有三種方式:

  1. 直接在HTML中定義元素的事件相關屬性
    缺點:違反了內(nèi)容與行為相分離的原則,應盡可能少用
<button onclick=alert('hello')>按鈕</button>
  1. DOM0級事件,在JS中為元素的事件相關屬性賦值
    此語法實現(xiàn)了內(nèi)容與行為相分離,但元素扔只能綁定一個監(jiān)聽函數(shù)
document.getElementById('btn').onclick = function(){
    //...
}
document.body.onload = init;
function init(){
    //...
}
  1. DOM2級事件,高級事件處理方式,一個事件可以綁定多個監(jiān)聽函數(shù)
    此語法可以為一個元素綁定多個監(jiān)聽函數(shù),但需要注意瀏覽器兼容性問題

參數(shù) : 事件類型 事件句柄 false冒泡(默認false)/true捕獲

btn.addEventListener('click',function(){     
    //...
},false) 
btn.addEventListener('click',function(){},flase);   //DOM
btn.attachEvent('onclick',function(){});    //IE
document.body.addEventListener('load',init);
document.body.attachEvent('onload',init);
function init(){
    //...
}

1.html中定義,html中寫js代碼,強耦合,不利于復用代碼
2.DOM0級事件,事件對象的屬性添加綁定事件,松耦合,缺點是有且只有一個事件句柄
3.DOM2級事件,通過addEventListener函數(shù)綁定事件,松耦合,綁定多個事件,事件捕獲和事件冒泡

事件解綁

移除addEventListener()方法添加的事件句柄

element.removeEventListener(event,function,useCapture)

參數(shù):
event : 必須,字符串,要移除的事件名稱
function : 必須,指定要移除的函數(shù)
useCapture : 可選,布爾值,指定移除事件句柄的階段

var fun = function(){   //解綁成功需要將事件句柄定義
    //...
}
btn.removeEventListener('click',fun,false)   

解綁成功要保證參數(shù)一致

IE事件流

添加事件

用于IE8以及以下的瀏覽器
attachEvent()
語法 : element.attachEvent(event,function)
功能 : 用于向指定元素添加事件句柄
參數(shù) : event事件名,必須加'on'前綴
function綁定事件的函數(shù)

移除事件

detachEvent()
同上

跨瀏覽器事件處理程序

事件句柄中,IE中的事件句柄 this是指向window

<button id="mybtn">點擊我</button>
<script>
    //兼容所有瀏覽器
    //addEventListener attachEvent
    var eventUtil = {
        addHandler : function(element,type,handler){
            //綁定事件
            //chrome,firefox,ie9等
            //ie8及以下瀏覽器
            if (element.addEventListener) {
                element.addEventListener(type,handler,false);
            }else if (element.attachEvent) {
                element.attachEvent('on'+type,handler);
            }else{
                element['on'+type] = null;
            }
        },
        removeHandler : function(element,type,handler){
            //移除事件
            if (element.removeEventListener) {
                element.removeEventListener(type,handler,false);
            }else if (element.detachEvent) {
                element.detachEvent('on'+type,handler);
            }else{
                element['on'+type] = null
            }
        }
    }
    var btn = document.getElementById('mybtn');
    var handler = function(){
        alert('clicked');
    }
    eventUtil.addHandler(btn,'click',handler);
    // eventUtil.removeHandler(btn,'click',handler);
</script>

事件冒泡和事件捕獲

事件周期

解釋器創(chuàng)建一個event對象后,會按如下過程將其在html元素間進行傳播:
第一階段 : 事件捕獲,事件對象沿DOM樹向下傳播
第二階段 : 目標觸發(fā),運行事件監(jiān)聽函數(shù)
第三階段 : 事件冒泡,事件沿DOM樹向上傳播

IE的事件模型中沒有事件捕獲階段

事件周期
<div id="parent">
    <div id="child">click son</div>     
</div>
<script>
    //事件冒泡 
    document.getElementById('parent').addEventListener('click',function(e){
        alert('parent事件觸發(fā),'+this.id)    
    },false);
    document.getElementById('child').addEventListener('click',function(e){
        alert('child事件觸發(fā),'+this.id)
    },false);
    //點擊后 child事件觸發(fā) parent事件觸發(fā)

    //事件捕獲
    document.getElementById('parent').addEventListener('click',function(e){
        alert('parent事件觸發(fā),'+this.id)    
    },true);
    document.getElementById('child').addEventListener('click',function(e){
        alert('child事件觸發(fā),'+this.id)
    },true);
    //點擊后 parent事件觸發(fā) child事件觸發(fā)
</script>

事件委托(原理是事件冒泡)

<div id="parent">
    <div id="child">click son</div>     
</div>
<ul id="ul">
    <li class="theli">1</li>
    <li class="theli2">2</li>
    <li class="theli3">3</li>
    <li class="theli4">4</li>
    <li class="theli5">5</li>
</ul>
<script>
    var ul = document.getElementById('ul');
    ul.addEventListener('click',function(){
        alert(event.target.className)
    })
</script>

event

event對象常用屬性和方法
  • type : 事件的類型
  • srcElement/target : 事件源,就是發(fā)生事件的元素;
  • cancelBubble : 布爾屬性,設為true的時候,將停止事件進一步氣泡到包容層次的元素
    (e.cancelBubble = true相當于e.stopPropagation())
  • returnValue : 布爾屬性,設置為false的時候可以阻止瀏覽器執(zhí)行默認的事件動作
    (e.returnValue = false相當于e.preventDefault())
  • event.clientY,pageY,screenY : 瀏覽器頂部底邊到鼠標位置(不包括滾動軸的距離) 瀏覽器頂部底邊到鼠標位置(包括滾動軸) 屏幕頂部底邊到鼠標位置
var btn = document.getElementById('child');
btn.addEventListener('click',function(e){
    alert(e.type)   //click
})
var parent = document.getElementById('parent');
parent.addEventListener('click',function(event){
    console.log(event.target);  //點擊誰誰就是target
    console.log(event.currentTarget);   //事件綁定在誰身上,就指向誰
})

*srcElement,cancelBubble,returnValue是IE的屬性 *

事件類型

  • onclick : 點擊
  • onfocus : 元素獲得焦點
  • onblur : 元素失去焦點
  • onmouseover : 鼠標移到某元素紙上
  • onmouseout : 鼠標從某元素移開
  • onmousedown : 鼠標按鈕被按下
  • onmousemove : 鼠標被移動
  • onmouseup : 鼠標按鍵被松開
UI事件
  1. load : 當頁面完全加載后在window上面觸發(fā)
EventUtil.addHandler(window,'load',function(e){
    alert('loaded');
});
//圖片預加載
var image = new Image();
EventUtil.addHandler(image,'load',function(event){
    alert('image loaded');
})
  1. resize : 窗口大小發(fā)生變化時觸發(fā)
  2. scroll : 窗口發(fā)生滾動時觸發(fā)
焦點事件
  1. blur : 元素失去焦點的時候觸發(fā)
  2. focus : 元素獲得焦點的時候觸發(fā)(不支持冒泡)
  3. focusin : 元素獲得焦點的時候觸發(fā),支持事件瀏覽器是IE5.5...支持冒泡
  4. focusout : 元素失去焦點的時候觸發(fā),支持事件瀏覽器是IE5.5...支持冒泡
鼠標事件
  1. click : 點擊
  2. dblclick : 雙擊
  3. mousedown : 鼠標按下時觸發(fā)的事件
  4. mouseup : 鼠標松開時觸發(fā)的事件
  5. mousemove : 鼠標移動時觸發(fā)的事件
  6. mouseout : 進入目標元素觸發(fā)(目標元素與其子元素都會執(zhí)行)
  7. mouseover : 離開目標元素觸發(fā)(目標元素與其子元素都會執(zhí)行)
  8. mouseenter : 只能進入目標元素觸發(fā)
  9. mouseleave : 只能離開目標元素觸發(fā)
鍵盤事件
  1. keydown
var myText = document.getElementById('myText');
//鍵碼,任意鍵觸發(fā)
EventUtil.addHandler(myText,'keydown',function(event){
    console.log(event.keyCode);
})
  1. keyup
  2. keypress : 按下字符鍵
  3. textInput : 輸入信息時觸發(fā)
EventUtil.addHandler(myText,'textInput',function(event){
    console.log(event.data);
})
  1. DOMContentLoaded : 在DOM樹之后觸發(fā),快于load
移動端事件類型
  1. 手指觸摸屏幕時觸發(fā)
EventUtil.addHandler(myBtn,'touchstart',function(event){
    console.log('當前觸摸屏幕的觸摸點數(shù)組' + event.touches);
    console.log('數(shù)組中只包含引起事件的觸摸點信息' + event.changedTouches);
    console.log('只包含放在元素上的觸摸信息' + event.targetTouches);
})
  1. 手指在屏幕上滑動時觸發(fā)
EventUtil.addHandler(myBtn,'touchmove',function(event){
    console.log(123456789);
})
  1. 手指從屏幕上移開時觸發(fā)
EventUtil.addHandler(myBtn,'touchend',function(event){
    console.log(123456789);
})
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市野建,隨后出現(xiàn)的幾起案子属划,更是在濱河造成了極大的恐慌,老刑警劉巖候生,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同眯,死亡現(xiàn)場離奇詭異,居然都是意外死亡唯鸭,警方通過查閱死者的電腦和手機须蜗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人明肮,你說我怎么就攤上這事菱农。” “怎么了晤愧?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵大莫,是天一觀的道長。 經(jīng)常有香客問我官份,道長只厘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任舅巷,我火速辦了婚禮羔味,結果婚禮上,老公的妹妹穿的比我還像新娘钠右。我一直安慰自己赋元,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布飒房。 她就那樣靜靜地躺著搁凸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狠毯。 梳的紋絲不亂的頭發(fā)上护糖,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音嚼松,去河邊找鬼嫡良。 笑死,一個胖子當著我的面吹牛献酗,可吹牛的內(nèi)容都是我干的寝受。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼罕偎,長吁一口氣:“原來是場噩夢啊……” “哼很澄!你這毒婦竟也來了?” 一聲冷哼從身側響起颜及,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痴怨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后器予,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪藻,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年乾翔,在試婚紗的時候發(fā)現(xiàn)自己被綠了爱葵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片施戴。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萌丈,靈堂內(nèi)的尸體忽然破棺而出赞哗,到底是詐尸還是另有隱情,我是刑警寧澤辆雾,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布肪笋,位于F島的核電站,受9級特大地震影響度迂,放射性物質(zhì)發(fā)生泄漏藤乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一惭墓、第九天 我趴在偏房一處隱蔽的房頂上張望坛梁。 院中可真熱鬧,春花似錦腊凶、人聲如沸划咐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褐缠。三九已至,卻和暖如春风瘦,著一層夾襖步出監(jiān)牢的瞬間队魏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工弛秋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留器躏,地道東北人俐载。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓蟹略,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遏佣。 傳聞我的和親對象是個殘疾皇子挖炬,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 總結: 鼠標事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,607評論 2 10
  • 以下文章為轉載,對理解JavaScript中的事件處理機制很有幫助状婶,淺顯易懂意敛,特分享于此。 什么是事件膛虫? 事件(E...
    jxyjxy閱讀 3,037評論 1 10
  • (續(xù)jQuery基礎(1)) 第5章 DOM節(jié)點的復制與替換 (1)DOM拷貝clone() 克隆節(jié)點是DOM的常...
    凜0_0閱讀 1,342評論 0 8
  • 第1章 鼠標事件 1-1 jQuery鼠標事件之click與dbclick事件 用交互操作中草姻,最簡單直接的操作就是...
    mo默22閱讀 1,282評論 0 6
  • 人生百態(tài)無非如是。接近放假的時候因為很閑稍刀,所以在網(wǎng)上找各種各樣的電影來消磨時間撩独,然后看到了李安的三部曲敞曹,我心想就看...
    麋鹿霜白閱讀 6,389評論 1 1