Js事件傳播流程及事件阻止

??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的峭弟。事件蒸殿,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬間触趴。既然事件是由一些交互所產(chǎn)生的力奋,那么就要了解這些事件是由頁面中的哪一部分交互所產(chǎn)生。

事件流

??事件流描述的是從頁面中接收事件的順序钞钙。但有意思的是鳄橘,IE 和 Netscape 開發(fā)團隊居然提出了差不多是完全相反的事件流的概念。IE 的事件流是事件冒泡流芒炼,而 Netscape Communicator 的事件流是事件捕獲流瘫怜。

  • 事件冒泡

??IE提出的事件流是事件冒泡流,這種事件流傳播是由內(nèi)向外進行傳遞本刽。即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節(jié)點)接收鲸湃,然后逐級向上傳播到較為不具體的節(jié)點(文檔)。比如:

<!DOCTYPE html>
<html> 
    <head> 
        <title>事件冒泡</title> 
    </head> 
    <body> 
        <div>
            <button></button>
        </div> 
    </body> 
</html>

在上述例子中子寓,假使你點擊了其中的button標簽暗挑,那么由事件冒泡所給的定義而言,其事件流的傳播流程為button --> div --> body --> html --> document斜友。即當點擊了button按鈕時炸裆,事件便由事件源開始一層一層向外層元素傳遞,直到傳遞到document元素上鲜屏。
??此外烹看,所有現(xiàn)代瀏覽器都支持事件冒泡国拇,但在具體實現(xiàn)上還是有一些差別。IE5.5 及更早版本中的事件冒泡會跳過<html>元素(從<body>直接跳到 document)惯殊。IE9酱吝、Firefox、Chrome 和 Safari 則將事件一直冒泡到 window 對象土思。

  • 事件捕獲

??Netscape Communicator 提出的事件流傳播方式為事件捕獲流务热,而事件捕獲流則是從外向內(nèi)傳播。即事件捕獲的思想是不太具體的節(jié)點應(yīng)該更早接收到事件己儒,而最具體的節(jié)點應(yīng)該最后接收到事件崎岂。事件捕獲的用意在于在事件到達預(yù)定目標之前捕獲它。這種思想恰恰和事件冒泡幾乎完全相反址愿。
??還以上面的為例该镣,按照事件捕獲的思想,其事件傳播流程為:document --> html -->body --> div --> button响谓。在事件捕獲過程中,document 對象首先接收到button上的 click 事件省艳,然后事件沿 DOM 樹依次向下(由外向內(nèi))娘纷,一直傳播到事件的實際目標,即事件源button元素跋炕。
??注意赖晶,雖然事件捕獲是 Netscape Communicator 唯一支持的事件流模型,但 IE9辐烂、Safari遏插、Chrome、Opera和 Firefox 目前也都支持這種事件流模型纠修。由于老版本的瀏覽器不支持胳嘲,因此很少有人使用事件捕獲。

DOM事件流

??“DOM2級事件”規(guī)定的事件流包括三個階段:事件捕獲階段扣草、處于目標階段和事件冒泡階段了牛。首先發(fā)生的是事件捕獲,為截獲事件提供了機會辰妙。然后是實際的目標接收到事件鹰祸。最后一個階段是冒泡階段,可以在這個階段對事件做出響應(yīng)密浑。如下:

<!DOCTYPE html>
<html> 
    <head> 
        <title>DOM事件流</title> 
    </head> 
    <body> 
        <div>
            <button></button>
        </div> 
    </body> 
</html>

??在 DOM 事件流中蛙婴,當點擊button元素后,實際的目標(<button>元素)在捕獲階段不會接收到事件尔破。這意味著在捕獲階段街图,事件從 document 到<html>再到<body>最后到<div>就停止了浇衬。下一個階段是“處于目標”階段,于是事件在<div>上發(fā)生台夺,并在事件處理中被看成冒泡階段的一部分径玖。然后,冒泡階段發(fā)生颤介,事件又傳播回document梳星。

事件阻止

  • event.stopPropagation()

  • event.cancleBubble = true

??這是阻止事件冒泡的兩種方法,不讓事件向document上蔓延滚朵,但是默認事件任然會執(zhí)行冤灾,當你對一個鏈接使用這兩方法中的一個時,如果點擊鏈接辕近,這個鏈接仍然會被打開韵吨,但是事件冒泡卻被阻止了。其兼容寫法為:

  if(event.stopPropagation){
       event.stopPropagation();
  }else{
       event.cancelBubble = true;
  }
  • event.preventDefault()

  • event.returnValue = false

??這是阻止默認行為的兩種方式移宅,第一種是W3C提供的方法归粉,第二種是IE提出的方法。當對一個鏈接使用以上兩種方法之一時漏峰,鏈接不會被打開糠悼,但是會發(fā)生事件冒泡;

  if(event.preventDefault){
       event.preventDefault();
  }else{
       event.returnValue= false;
  }
  • return false

??這個方法能夠?qū)崿F(xiàn)同時阻止默認行為和事件冒泡浅乔。即當對一個鏈接使用時倔喂,會使這個鏈接不能實現(xiàn)點擊跳轉(zhuǎn)頁面,并且也不會沿dom樹向上進行冒泡靖苇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末席噩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贤壁,更是在濱河造成了極大的恐慌悼枢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯砸,死亡現(xiàn)場離奇詭異萧芙,居然都是意外死亡,警方通過查閱死者的電腦和手機假丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門双揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人包帚,你說我怎么就攤上這事渔期。” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵疯趟,是天一觀的道長拘哨。 經(jīng)常有香客問我,道長信峻,這世上最難降的妖魔是什么倦青? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮盹舞,結(jié)果婚禮上产镐,老公的妹妹穿的比我還像新娘。我一直安慰自己踢步,他們只是感情好癣亚,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著获印,像睡著了一般述雾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兼丰,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天玻孟,我揣著相機與錄音,去河邊找鬼鳍征。 笑死取募,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蟆技。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斗忌,長吁一口氣:“原來是場噩夢啊……” “哼质礼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起织阳,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眶蕉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唧躲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體造挽,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年弄痹,在試婚紗的時候發(fā)現(xiàn)自己被綠了饭入。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肛真,死狀恐怖谐丢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤乾忱,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布讥珍,位于F島的核電站,受9級特大地震影響窄瘟,放射性物質(zhì)發(fā)生泄漏衷佃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一蹄葱、第九天 我趴在偏房一處隱蔽的房頂上張望氏义。 院中可真熱鬧,春花似錦新蟆、人聲如沸觅赊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吮螺。三九已至,卻和暖如春帕翻,著一層夾襖步出監(jiān)牢的瞬間鸠补,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工嘀掸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留紫岩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓睬塌,卻偏偏與公主長得像泉蝌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揩晴,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的硫兰。 ??事件诅愚,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評論 1 11
  • JavaScript 程序采用了異步事件驅(qū)動編程模型。在這種程序設(shè)計風(fēng)格下劫映,當文檔违孝、瀏覽器、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,256評論 3 11
  • JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的泳赋。事件雌桑,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬...
    threetowns閱讀 342評論 0 0
  • 一:什么是事件流呢? 通俗的來說摹蘑,可以想象畫在一張紙上的一組同心圓筹燕。如果你把手指放在圓心上,那么你的手指指向的不是...
    68e94e5ea9bc閱讀 855評論 0 50
  • DOM0級和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別? DOM0級事件監(jiān)聽:用JavaScript指定事件處理程序...
    LeeoZz閱讀 376評論 0 1