事件高級1

1 事件冒泡

當一個元素接收到事件的時候 會把他接收到的事件傳給自己的父級喇澡,一直到window错沽。當某個dom上的事件被觸發(fā)楼肪,那么其父級元素的該事件也會被逐級觸發(fā)寿桨。

例子1:

var div1 = document.getElementById("div1");

var div2 = document.getElementById("div2");

 div2.onclick = function(){console.log(‘我是內(nèi)層div’);};

 div1.onclick = function(){console.log(‘我是外外層div’);};

 <div id="div1">

 <div id="div2"></div>

 </div>

例子:將內(nèi)層div通過絕對定位放置于div3內(nèi)

事件冒泡的原理圖:
309bb95b0858e544b38a92c9cc1ce5a2.png

以上類似一個dom片段

<body>
  <div>
    <div>
      <div class=”content”>666</div>
    </div>
  </div>
</body>

每個dom對象都是嵌套的,形成一個金字塔形結(jié)構(gòu)琅坡,且每個對象都有諸如onclick屬性
如下圖

ef7daf45d2c8f0438343bb39f139c581.png

根據(jù)瀏覽器廠商自定規(guī)則悉患,當事件觸發(fā)時會(比如onclick)收集個層級對象上的onclick函數(shù)體與參數(shù)形成一個數(shù)組

[{fn:function(){
},org},
{fn:function(){
},org},
null,
{fn:function(){
},org},
null,null]

我們假設(shè)它叫eventArr

然后遍歷eventArr數(shù)組按順序調(diào)用

這就是所謂的事件冒泡,據(jù)上可知脑蠕,并不會將dom節(jié)點上的事件函數(shù)‘傳遞’給父級元素,只是會按順序調(diào)用父級對應(yīng)的事件函數(shù)跪削,如果未綁定谴仙,那么就會略過

2事件捕獲:

將例子1中的事件綁定方式變?yōu)?/p>

dom.addEventListener('click',function(){
        console.log('我是內(nèi)層div')
},true);

注意第三個參數(shù)必須為true
可見其執(zhí)行順序就是從外到內(nèi) 相當于按eventArr的正序執(zhí)行個事件函數(shù),而事件冒泡是將eventArr倒敘排列后再執(zhí)行

3 DOM事件流:

事件捕獲階段碾盐、處于目標階段晃跺、事件冒泡階段
事件捕獲從外到內(nèi)收集事件函數(shù)形成eventArr 然后執(zhí)行
將eventArr倒敘排列后 執(zhí)行,第一個元素的執(zhí)行即為處于目標階段毫玖,之后的執(zhí)行過程叫事件冒泡掀虎,那么我們使用dom.onclick時如何實現(xiàn)事件捕獲呢凌盯?

4 事件等級:

DOM0級事件時 微軟(IE)按事件冒泡處理 網(wǎng)景(Netscape)按事件捕獲

DOM1級 只存在于理論上

//DOM2級 
dom.addEventListener('click',function(){//使用事件監(jiān)聽器進行事件綁定

 console.log('我是內(nèi)層div')

},true);//第三個參數(shù)默認false(冒泡)傳true的話(捕獲)

DOM2級事件與DOM0事件的不同點:

前者靠事件監(jiān)聽器綁定事件,可多次綁定同一類型事件

后者直接綁定烹玉,多次綁定會覆蓋

dom.addEventListener函數(shù)的第一個參數(shù)為事件名(注意不加on)驰怎,第二個參數(shù)為事件函數(shù),第三個參數(shù)為冒泡與否

移除事件時后者置空二打,前者使用

removeEventListener(type,fn,boolean)

boolean必須與綁定時一致

IE瀏覽器的事件監(jiān)聽器
attachEvent(‘onclick’,fn)

移除事件時采用
detachEvent(‘onclick’,fn)

那么一個跨瀏覽器的事件綁定移除函數(shù)應(yīng)該這樣書寫

addEvent(elment,type,fn){
  if(elment.addEventListener){
    }else if(elment.attachEvent){
      }else{
    }
  }
  removeEvent(element,type,fn){
  if(elment.removeEventListener){
    }else if(elment.detachEvent){
    }else{
  }
}

5事件對象:

兼容DOM的瀏覽器會將一個event對象傳入到事件處理程序中县忌。無論指定事件處理程序時使用DOM0級或是DOM2級,都會傳入event對象继效。event對象包含一些特定的屬性和方法症杏,方便我們調(diào)用

  • target始終指向觸發(fā)事件的dom節(jié)點
  • currentTarget指向事件函數(shù)綁定的dom節(jié)點

在事件處理程序內(nèi)部,對象this始終等于currentTarget的值瑞信,而target則只包含事件觸發(fā)實際目標厉颤。如果直接將事件處理程序指定給了目標元素,則this凡简、currentTarget逼友、和target包含相同的值。

  • IE的事件對象:window.event;
  • 其他的:event
  • 目標dom IE:event.srcElement; 其他:event.target
  • target屬性 觸發(fā)事件的dom對象
  • srcElement屬性 對于生成事件的 Window 對象潘鲫、Document 對象或 Element 對象的引用
  • clientX屬性 返回當事件被觸發(fā)時翁逞,鼠標指針的水平坐標
  • clientY屬性 返回當事件被觸發(fā)時,鼠標指針的垂直坐標
  • pageX屬性 與clientX同值
  • pageY屬性 與clientY同值
    建議使用client溉仑,兼容性好點
    d7abf29a81fca9008f98f4204b8bc33c.png
  • offsetX距離元素左邊框 IE的x相當于此值
  • clientX距離瀏覽器可視區(qū)域 其他瀏覽器的x相當于此值
  • screenX距離屏幕左側(cè)


    e7adf76b5303aca498ef2794f26f7c92.png

6 事件類型

  1. 焦點事件:
    1) focus 元素獲得焦點(不會冒泡)
    2 ) blur 元素失去焦點(不會冒泡)

  2. 鼠標與滑輪事件:
    mouseenter 指針移到有事件監(jiān)聽的元素內(nèi)
    mouseover 該事件冒泡
    mousemove 指針在元素內(nèi)移動時持續(xù)觸發(fā)
    mousedown 在元素上按下任意鼠標按鈕
    mouseup 在元素上釋放任意鼠標按鍵
    click 在元素上按下并釋放任意鼠標按鍵
    dblclick 在元素上雙擊鼠標按鈕
    contextmenu 右鍵點擊 (右鍵菜單顯示前).
    mousewheel 滾輪向任意方向滾動
    IE挖函、chrome監(jiān)聽的是wheelDelta,向下滾動其值為-120; 向上滾動其值為120
    wheel FF監(jiān)聽的是detail,向下滾動其值為3浊竟;向上滾動其值 為-3
    mouseleave 指針移出元素范圍外(不冒泡)
    mouseout 指針移出元素怨喘,或者移到它的子元素上

  3. 鼠標按鍵事件會返回button值
    0 規(guī)定鼠標左鍵
    1 規(guī)定鼠標中鍵
    2 規(guī)定鼠標右鍵

  4. 鍵盤事件

  • 鍵盤事件包括keydown(按下鍵盤時觸發(fā)該事件),keypress(只要按下的鍵并非Ctrl, Alt, Shift振定,就接著觸發(fā)keypress事件), keyup(松開鍵盤時觸發(fā)該事件)

  • altKey必怜,ctrlKey,shiftKey: 返回一個布爾值后频,表示是否按下對應(yīng)的鍵

  • key: 返回一個字符串梳庆,表示按下的鍵名。如果同時按下一個控制鍵和一個符號鍵卑惜,則返回符號鍵的鍵名

  • keyCode: 返回按鍵的 ASCII 碼膏执,注意: 這里是不區(qū)分大小寫的

  1. 文本事件
    input 文本框輸入字符時觸發(fā)
    change 文本框內(nèi)容改變時觸發(fā)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市露久,隨后出現(xiàn)的幾起案子更米,更是在濱河造成了極大的恐慌,老刑警劉巖毫痕,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征峦,死亡現(xiàn)場離奇詭異迟几,居然都是意外死亡,警方通過查閱死者的電腦和手機栏笆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門类腮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竖伯,你說我怎么就攤上這事存哲。” “怎么了七婴?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵祟偷,是天一觀的道長。 經(jīng)常有香客問我打厘,道長修肠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任户盯,我火速辦了婚禮嵌施,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莽鸭。我一直安慰自己吗伤,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布硫眨。 她就那樣靜靜地躺著足淆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礁阁。 梳的紋絲不亂的頭發(fā)上巧号,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音姥闭,去河邊找鬼丹鸿。 笑死,一個胖子當著我的面吹牛棚品,可吹牛的內(nèi)容都是我干的靠欢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铜跑,長吁一口氣:“原來是場噩夢啊……” “哼门怪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疼进,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤薪缆,失蹤者是張志新(化名)和其女友劉穎秧廉,沒想到半個月后伞广,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拣帽,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年嚼锄,在試婚紗的時候發(fā)現(xiàn)自己被綠了减拭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡区丑,死狀恐怖拧粪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沧侥,我是刑警寧澤可霎,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宴杀,受9級特大地震影響癣朗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旺罢,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一旷余、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扁达,春花似錦正卧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惠遏,卻和暖如春砾跃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背节吮。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工抽高, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人透绩。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓翘骂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帚豪。 傳聞我的和親對象是個殘疾皇子碳竟,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的莹桅。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評論 1 11
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,126評論 0 21
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點是DOM的常...
    凜0_0閱讀 1,340評論 0 8
  • JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的烛亦。事件诈泼,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 679評論 0 4
  • 本篇博客源地址 總結(jié): 鼠標事件 1.click與dbclick事件ele.click()ele.click(ha...
    ZombieBrandg閱讀 674評論 0 1