前端事件綁定知識(shí)點(diǎn)(面試持购螅考)

簡(jiǎn)介

事件是可以被 JavaScript 偵測(cè)到的行為近哟。

網(wǎng)頁(yè)中的每個(gè)元素都可以產(chǎn)生某些可以觸發(fā) JavaScript 函數(shù)或程序的事件。

事件通常與函數(shù)配合使用钱豁,當(dāng)事件發(fā)生時(shí)函數(shù)才會(huì)執(zhí)行耻卡。

執(zhí)行JS 事件的方式:

  • HTML 事件屬性可以直接執(zhí)行 JavaScript 代碼
  • HTML 事件屬性可以調(diào)用 JavaScript 函數(shù)
  • 你可以為 HTML 元素指定自己的事件處理程序
  • 你可以阻止事件的發(fā)生。
  • 等等 ...
常用的JS事件 type
鼠標(biāo)單擊事件 onclick
鼠標(biāo)經(jīng)過(guò)事件 onmouseover
鼠標(biāo)移開事件 onmouseout
聚焦事件 onfocus
失焦事件 onblur
加載事件 onload
刷新頁(yè)面 onunload(貌似只對(duì)IE有效)
關(guān)閉頁(yè)面 onbeforeunload(貌似只對(duì)IE有效)

事件流

事件流描述的是從頁(yè)面中接受事件的順序牲尺。

  • IE 的事件流是事件冒泡流卵酪,事件由子元素獲取并沿DOM樹向上傳播。即事件最開始由最具體的元素(文檔中嵌套層次最深的那個(gè)節(jié)點(diǎn))接收谤碳,然后逐級(jí)向上轉(zhuǎn)播至最不具體的節(jié)點(diǎn)(document)凛澎,用 stopPropagation() 方法終止冒泡。
  • Netscape 的事件流是事件捕獲流估蹄,事件由根元素獲取并沿DOM樹向下分發(fā)塑煎。與事件冒泡流相反,事件捕獲的思想是不太具體的節(jié)點(diǎn)(document)應(yīng)該更早接收到事件臭蚁,而最具體的節(jié)點(diǎn)最后接收到事件最铁。已經(jīng)不適用了

Event 對(duì)象

HTML DOM Event 對(duì)象

header 1 header 2
事件 event
事件目標(biāo) event.target
添加事件 element.addEventListener(type, listener, false)
移除事件 element.removeEventListener(type, listener, false)
阻止事件冒泡 event.stopPropagation()
取消默認(rèn)行為 event.preventDefault()

IE 中的 Event 對(duì)象

header 1 header 2
事件 window.event
事件目標(biāo) event.srcElement
添加事件 element.attachEvent('on' + type, listener)
移除事件 element.detachEvent('on' + type, listener)
阻止事件冒泡 event.cancelBubble = true
取消默認(rèn)行為 event.returnValue = false

事件處理程序

HTML 事件處理程序

事件直接寫在html的元素里面,缺點(diǎn):html和js代碼緊密的耦合在一起垮兑。

<a href="" onclick="alert('msg');">測(cè)試</a>

0級(jí) DOM事件處理程序

把一個(gè)函數(shù)賦值給一個(gè)事件的處理程序?qū)傩岳湮荆瑑?yōu)點(diǎn):比較簡(jiǎn)單,跨瀏覽器支持系枪。缺點(diǎn):不能添加多個(gè)事件處理程序雀哨,最后一個(gè)事件會(huì)覆蓋前面的事件

document.getElementById('id').onclick = function () {
    alert(1);
}

2級(jí) DOM事件處理程序

通過(guò) addeventlistener() 添加事件,只能用 removeEventlistener() 刪除此事件。它們都接收三個(gè)參數(shù):要處理的事件名event(不加'on')雾棺、作為事件處理程序的函數(shù)function(優(yōu)點(diǎn):可以添加多個(gè)事件處理程序膊夹,)和一個(gè)布爾值useCapture。布爾參數(shù)僅僅在現(xiàn)代瀏覽器最近的幾個(gè)版本中是可加可不加的捌浩,并且true代表該事件在捕獲階段執(zhí)行放刨,false代表在冒泡階段執(zhí)行,建議寫false尸饺,因?yàn)橛行g覽器只有冒泡階段进统。

target.addEventListener(type, listener[, useCapture]);
target.removeEventListener(type, listener[, useCapture]);

IE 事件處理程序

IE8 及更早IE版本不支持 addEventListener() 方法,Opera 7.0 及 Opera 更早版本也不支持浪听。 但是螟碎,對(duì)于這些不支持該函數(shù)的瀏覽器,你可以使用 attachEvent() 方法來(lái)添加事件句柄迹栓。通過(guò) attachEvent() 添加事件抚芦,只能用 detachEvent() 刪除此事件。這兩個(gè)方法接收相同的兩個(gè)參數(shù):事件處理程序名稱 type 與事件處理函數(shù) function迈螟,不支持第三個(gè)參數(shù)的原因:IE8--只支持冒泡冒泡流叉抡。

element.attachEvent(type, function)
element.detachEvent(type, function)

事件代理和委托

當(dāng)我們需要對(duì)很多元素添加事件的時(shí)候,可以通過(guò)將事件添加到它們的父節(jié)點(diǎn)而將事件委托給父節(jié)點(diǎn)來(lái)觸發(fā)處理函數(shù)答毫。這主要得益于瀏覽器的事件冒泡機(jī)制褥民。

<div id="box">
    <p>Lorem ipsum dolor sit amet.</p>
    <p>Lorem ipsum dolor sit amet.</p>
    <p>Lorem ipsum dolor sit amet.</p>
</div>

<script>
    let box = document.getElementById('box');
    box.addEventListener('click', function (e) {
        // 檢查事件源e.targe是否為P
        if (e.target.nodeName === 'P') {
            // 真正的處理過(guò)程在這里
            alert('p');
        }
    })
</script>

跨瀏覽器兼容的事件處理程序(能力檢測(cè))

/*
 * @Author: bxm09
 * @Date:   2017-03-24 15:51:37
 * @Last Modified by:   bxm09
 * @Last Modified time: 2017-07-24 13:16:04
 * @Desc 跨瀏覽器兼容的事件處理程序(能力檢測(cè))
 */

var eventshiv = {
    // event兼容
    getEvent: function(event) {
        return event ? event : window.event;
    },

    // type兼容
    getType: function(event) {
        return event.type;
    },

    // target兼容
    getTarget: function(event) {
        return event.target ? event.target : event.srcelem;
    },

    /**
     * 添加事件句柄
     * 2級(jí) DOM -> IE -> 0級(jí) DOM
     */
    addHandler: function(elem, type, listener) {
        if (elem.addEventListener) {
            elem.addEventListener(type, listener, false);
        } else if (elem.attachEvent) {
            elem.attachEvent('on' + type, listener);
        } else {
            // 在這里由于.與'on'字符串不能鏈接,只能用 []
            elem['on' + type] = listener;
        }
    },

    // 移除事件句柄
    removeHandler: function(elem, type, listener) {
        if (elem.removeEventListener) {
            elem.removeEventListener(type, listener, false);
        } else if (elem.detachEvent) {
            elem.detachEvent('on' + type, listener);
        } else {
            elem['on' + type] = null;
        }
    },

    /**
     * 添加事件代理
     */
    addAgent: function (elem, type, agent, listener) {
        elem.addEventListener(type, function (e) {
            if (e.target.matches(agent)) {
                listener.call(e.target, e); // this 指向 e.target
            }
        });
    },

    /**
     * 取消默認(rèn)行為
     * 非IE -> IE
     */
    preventDefault: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    /**
     * 阻止事件冒泡
     * 非IE -> IE
     */
    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
};

console.log('eventshiv.js 文件加載成功洗搂!');

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末消返,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耘拇,更是在濱河造成了極大的恐慌撵颊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惫叛,死亡現(xiàn)場(chǎng)離奇詭異倡勇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嘉涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門妻熊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仑最,你說(shuō)我怎么就攤上這事扔役。” “怎么了警医?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亿胸,是天一觀的道長(zhǎng)坯钦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)侈玄,這世上最難降的妖魔是什么婉刀? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮拗馒,結(jié)果婚禮上路星,老公的妹妹穿的比我還像新娘溯街。我一直安慰自己诱桂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布呈昔。 她就那樣靜靜地躺著挥等,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堤尾。 梳的紋絲不亂的頭發(fā)上肝劲,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音郭宝,去河邊找鬼辞槐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粘室,可吹牛的內(nèi)容都是我干的榄檬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衔统,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹿榜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锦爵,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舱殿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后险掀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪袭,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年樟氢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枝恋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗡害,死狀恐怖焚碌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霸妹,我是刑警寧澤十电,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響鹃骂,放射性物質(zhì)發(fā)生泄漏台盯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一畏线、第九天 我趴在偏房一處隱蔽的房頂上張望静盅。 院中可真熱鬧,春花似錦寝殴、人聲如沸蒿叠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)市咽。三九已至,卻和暖如春抵蚊,著一層夾襖步出監(jiān)牢的瞬間施绎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工贞绳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷醉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓冈闭,卻偏偏與公主長(zhǎng)得像俱尼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拒秘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型号显。在這種程序設(shè)計(jì)風(fēng)格下,當(dāng)文檔躺酒、瀏覽器押蚤、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,256評(píng)論 3 11
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂(lè)君閱讀 5,514評(píng)論 0 106
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,360評(píng)論 24 450
  • 片段一 著眼于優(yōu)點(diǎn)而不是缺點(diǎn) 正如下圖所表明的那樣,你的孩子或?qū)W生可能85%是優(yōu)點(diǎn)园匹,15%是缺點(diǎn)雳刺。可是裸违,大多數(shù)大人...
    Fly_Catkin閱讀 880評(píng)論 0 0
  • 什么是視覺(jué)化呢掖桦?雷子老師是這樣說(shuō)的。 視覺(jué)化是要學(xué)習(xí)畫畫嗎供汛? NO 聽到畫畫這個(gè)詞枪汪,我想很多人和我一樣感覺(jué)會(huì)有種...
    華楓閱讀 756評(píng)論 0 2