DOM 必考題

1函喉、請(qǐng)簡(jiǎn)述DOM事件模型

  • 什么是DOM事件模型:每一個(gè)事件都會(huì)先經(jīng)歷從上到下的捕獲階段捐下,再經(jīng)歷從下到上的冒泡階段啤握。
  • 如何選擇捕獲or冒泡:添加事件監(jiān)聽時(shí)候addEventListener(’click’,fn,true/false) 第三個(gè)參數(shù)可以選擇階段。
    true表示把它放到捕獲階段,false或者不傳把它放到冒泡階段。
  • 在這兩個(gè)階段希望停止傳播(捕獲/冒泡到一個(gè)div就不要往下走了)
    可以使用 event.stopPropagation() 來阻止捕獲或冒泡乞娄。

2、手寫事件委托

BUG版(正確答案)

思路:
當(dāng)用戶點(diǎn)擊列表時(shí),他點(diǎn)擊的目標(biāo)e.target,的標(biāo)簽名tagName,小寫之后是li(默認(rèn)大寫)
如果是li那就說明它點(diǎn)擊列表中的某一項(xiàng)契沫,就執(zhí)行某個(gè)函數(shù)口予。

事件委托就是木张,我不監(jiān)聽li我監(jiān)聽li的爸爸。只要點(diǎn)擊li就會(huì)觸發(fā)函數(shù)。

我們?cè)谑褂胻arget的時(shí)候是用e.target 還是 e.currentTarge剧浸?
兩者區(qū)別:
currentTarge是我監(jiān)聽的對(duì)象腾啥,比如說我監(jiān)聽ul,那就是ul
target是用戶觸發(fā)的對(duì)象,它點(diǎn)span那就是span它點(diǎn)li就是li

 ul.addEventListener('click', function(e){
     if(e.target.tagName.toLowerCase() === 'li'){
         fn()// 執(zhí)行某個(gè)函數(shù)
     }
 })

bug 在于,如果用戶點(diǎn)擊的是 li 里面的 span仪吧,就沒法觸發(fā) fn吭从,這顯然不對(duì)。

bug就bug吧工作中不用自己寫,Vue/React中自動(dòng)幫你事件委托了。

高級(jí)無BUG版本

思路:當(dāng)你點(diǎn)擊span后,遞歸遍歷span的祖先元素找li 最多看到ul.

function delegate(elemet,eventType,selector,fn){
  element.addEventListener(eventType,e=>{
    let el = e.target
    while(!el.matches(selector)){//el.matches(selector)判斷你點(diǎn)擊的元素是不是li
      if(element === el){  //如果我找到的元素等于ul了 移袍,那說明沒找到li那就置為空
       el = null
       break
      }
       el = el.parentNode //讓你等于你爸爸,再循環(huán)看看你是不是li
    }
    //跳出循環(huán)后如果el空那就什么都不做涂籽,否則執(zhí)行fn此時(shí)fn的this是el
    el && fn.call(el,e) 
  })
  return element
}

delegate(ul,'click',li,f1)
只要你點(diǎn)擊了ul中的li(無論是li自身還是li后代)執(zhí)行fl.

事件委托的好處與壞處
好處:
1砂轻、節(jié)省監(jiān)聽器
2、動(dòng)態(tài)監(jiān)聽
壞處:
調(diào)試比較復(fù)雜文兑,不容易確定當(dāng)前元素有哪些事件監(jiān)聽∶夷可能點(diǎn)擊一個(gè)div觸發(fā)莫名其妙的事件甸怕,因?yàn)辄c(diǎn)擊的div可能有n多父元素,不可能一層一層的找。

http://www.reibang.com/p/d94dc9be547e

3释液、手寫可拖拽div

  • mousedown 事件在指針設(shè)備按鈕按下時(shí)觸發(fā)。
  • 當(dāng)指針在元素中時(shí)躺盛, mouseup事件在指針設(shè)備(如鼠標(biāo)或觸摸板)按鈕放開時(shí)觸發(fā)。
  • 當(dāng)指針設(shè)備 ( 通常指鼠標(biāo) ) 在元素上移動(dòng)時(shí)仿耽,mousemove 事件被觸發(fā)俺泣。
  • clientX 事件屬性返回當(dāng)事件被觸發(fā)時(shí)鼠標(biāo)指針相對(duì)于瀏覽器頁(yè)面(或客戶區(qū))的水平坐標(biāo)。
  • parseInt 解析一個(gè)字符串返回一個(gè)整數(shù)鹏秋。
  • 代碼
    JS Bin - 手寫拖拽div
  • 思路:我鼠標(biāo)按下div的時(shí)候記錄初始坐標(biāo)尊蚁,當(dāng)我移動(dòng)的時(shí)候做差然后對(duì)div進(jìn)行移動(dòng)。移動(dòng)完了記錄基準(zhǔn)點(diǎn)侣夷。
  • 要點(diǎn)
    1横朋、注意監(jiān)聽范圍,不能只監(jiān)聽div
    mousedown是監(jiān)聽div其他放在document上
    因?yàn)槿绻挤旁赿iv上大幅度移動(dòng)容易掉百拓,超出div且只監(jiān)聽div
    2琴锭、使用transfrom 比top/left性能更好避免reflow和repaint
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衙传,隨后出現(xiàn)的幾起案子决帖,更是在濱河造成了極大的恐慌,老刑警劉巖蓖捶,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件地回,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刻像,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門畅买,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人细睡,你說我怎么就攤上這事谷羞。” “怎么了溜徙?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵洒宝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我萌京,道長(zhǎng),這世上最難降的妖魔是什么宏浩? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任知残,我火速辦了婚禮,結(jié)果婚禮上比庄,老公的妹妹穿的比我還像新娘求妹。我一直安慰自己,他們只是感情好佳窑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布制恍。 她就那樣靜靜地躺著,像睡著了一般神凑。 火紅的嫁衣襯著肌膚如雪净神。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天溉委,我揣著相機(jī)與錄音鹃唯,去河邊找鬼。 笑死瓣喊,一個(gè)胖子當(dāng)著我的面吹牛坡慌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藻三,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洪橘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了棵帽?” 一聲冷哼從身側(cè)響起熄求,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逗概,沒想到半個(gè)月后迷守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族奢,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客年,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年回懦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米苹。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秘噪,到底是詐尸還是另有隱情,我是刑警寧澤勉耀,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布指煎,位于F島的核電站,受9級(jí)特大地震影響便斥,放射性物質(zhì)發(fā)生泄漏至壤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一枢纠、第九天 我趴在偏房一處隱蔽的房頂上張望像街。 院中可真熱鬧,春花似錦晋渺、人聲如沸镰绎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畴栖。三九已至,卻和暖如春八千,著一層夾襖步出監(jiān)牢的瞬間吗讶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工恋捆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留关翎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓鸠信,卻偏偏與公主長(zhǎng)得像纵寝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子星立,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • lucky出品 必屬精品 DOM操作 當(dāng)網(wǎng)頁(yè)被加載時(shí)绰垂,瀏覽器會(huì)創(chuàng)建頁(yè)面的文檔對(duì)象模型(Document Objec...
    帥氣的Lucky閱讀 470評(píng)論 0 0
  • JavaScript中Dom 1.基本概念 1.1 什么是window? window:是一個(gè)全局對(duì)象, 代表瀏覽...
    煤球快到碗里來閱讀 249評(píng)論 0 0
  • 點(diǎn)擊事件 第一部分.概念 給3個(gè)div分別添加事件監(jiān)聽fnYe/fnBa/fnEr提問一:點(diǎn)擊了誰室奏?點(diǎn)擊文字,算不...
    珍惜時(shí)間小李閱讀 223評(píng)論 0 0
  • 一劲装、初識(shí)jQuery.js jQuery.js是一款優(yōu)秀的JS類庫(kù)胧沫,其本質(zhì)就是在一個(gè)立即執(zhí)行的匿名函數(shù)中的閉包昌简,j...
    劉遠(yuǎn)舟閱讀 606評(píng)論 1 0
  • 放自己用DOM寫的作品鏈接寫于2017.08.07一纯赎、關(guān)于DOM 什么是DOMDOM是JavaScript操作網(wǎng)頁(yè)...
    田田kyle閱讀 353評(píng)論 0 0