事件冒泡是什么如何用jquery阻止事件冒泡
更新時(shí)間:2013年03月20日 17:15:04 作者:
什么是事件起泡:一個(gè)事件不能憑空產(chǎn)生,這就是事件的發(fā)生等等,接下來為大家介紹下jquery阻止事件起泡以及關(guān)于js事件起泡的驗(yàn)證,感興趣的朋友可以參考下哈
(1)什么是事件起泡
首先你要明白一點(diǎn),當(dāng)一個(gè)事件發(fā)生的時(shí)候,該事件總是有一個(gè)事件源,即引發(fā)這個(gè)事件的對象,一個(gè)事件不能憑空產(chǎn)生,這就是事件的發(fā)生。
當(dāng)事件發(fā)生后,這個(gè)事件就要開始傳播。為什么要傳播呢?因?yàn)槭录幢旧聿]有處理事件的能力。例如我們點(diǎn)擊一個(gè)按鈕時(shí),就會產(chǎn)生一個(gè)click事件,但這個(gè)按鈕本身不能處理這個(gè)事件(廢話),事件必須從這個(gè)按鈕傳播出去,從而到達(dá)能夠處理這個(gè)事件的代碼中(例如我們給按鈕的onclick屬性賦一個(gè)函數(shù)的名字,就是讓這個(gè)函數(shù)去處理該按鈕的click事件)。
當(dāng)事件在傳播過程中,找到了一個(gè)能夠處理它的函數(shù),這時(shí)候我們就說這個(gè)函數(shù)捕捉到了這個(gè)事件。
說到這里,關(guān)鍵的問題來了,那就是一個(gè)函數(shù)是如何捕捉一個(gè)事件的呢?這就涉及到事件的冒泡了。
為了更好地理解冒泡的概念,我建議你現(xiàn)在想象一下你的面前放著一杯水,但這杯水和我們平時(shí)看到的有點(diǎn)點(diǎn)不同,它分為數(shù)層,每一層又分成一或多個(gè)區(qū)域,最頂層是我們熟悉的窗口對象(即window對象),下一層分為好幾個(gè)區(qū)域(document對象、history對象等等),而document對象的下一層又分為多個(gè)子對象。
這些對象的層次關(guān)系構(gòu)成了DOM中的對象樹。
事件的傳播是有方向的,當(dāng)點(diǎn)擊一個(gè)按鈕時(shí)所產(chǎn)生的事件從這個(gè)按鈕處開始向上傳播(就像一個(gè)水泡從杯底冒上來,這就是之所以叫事件冒泡的原因),但這個(gè)事件總是尋找特定的屬性是否有值。例如按鈕的click事件先尋找在按鈕上是否有onclick屬性的有意義的定義(即該屬性指向一個(gè)存在的函數(shù)或一段可執(zhí)行的語句),如果有,執(zhí)行這個(gè)函數(shù)或語句;然后事件繼續(xù)向上傳播,到達(dá)按鈕的上一層對象(例如一個(gè)form對象或document對象,總之是包含了按鈕的父對象),如果該對象也定義了onclick屬性,則執(zhí)行屬性的值。
所以,如果這個(gè)按鈕上面有3層(form、document、window),且這三層都定義了onclick屬性,則當(dāng)按鈕的click事件產(chǎn)生時(shí),將會調(diào)用4個(gè)(包括按鈕本身的一個(gè))函數(shù)或執(zhí)行4段語句。
事件的這幾個(gè)特性在0級dom中也是適用的。
(2)jquery阻止事件起泡實(shí)例
1、通過返回false來取消默認(rèn)的行為并阻止事件起泡。
jQuery 代碼:
$("form").bind(
"submit",
function() {
return false;
}
);
2、通過使用 preventDefault() 方法只取消默認(rèn)的行為。
jQuery 代碼:
$("form").bind(
"submit",
function(event){
event.preventDefault();
}
);
3、通過使用 stopPropagation() 方法只阻止一個(gè)事件起泡。
jQuery 代碼:
$("form").bind(
"submit",
function(event){
event.stopPropagation();
}
);
(3)關(guān)于js事件起泡的驗(yàn)證
今天這個(gè)問題主要涉及到幾個(gè)關(guān)鍵詞:對象,觸發(fā)事件,捕獲事件,執(zhí)行處理、起泡。這其實(shí)就是整個(gè)js執(zhí)行的過程。其中冒泡這個(gè)過程很有意思。其實(shí)就像是一杯水,但是這杯水是分層次的,最底下是當(dāng)前觸發(fā)事件的對象。然后越往上范圍越大,最頂層肯定是window,倒數(shù)第二層是document。氣泡在上浮過程中會判斷當(dāng)前所到達(dá)的層有沒有綁定事件處理方法。有話就執(zhí)行相應(yīng)的處理。沒有的話就繼續(xù)起泡。直到到達(dá)最頂層的window窗口層。我們可以在任何一層做相應(yīng)的處理以阻止事件繼續(xù)起泡。方法就是調(diào)用事件對象的阻止起泡的方法。event.stopPropagation();下面是寫的一個(gè)驗(yàn)證js事件起泡的過程方法。
<script type="text/javascript">
$(document).ready(function(){
$('.one').click(function(e){
alert('one');
});
$('.two').click(function(e){
alert('two');
});
$('.three').click(function(e){
alert('three');
//阻止起泡取消下面的注釋
// e.stopPropagation();
});
});
</script>
<div class="one" style="width:200px;height:200px;background:green;">
one
<div class="two" style="width:150px;height:150px;background:yellow;">
two
<div class="three">
three
</div>
</div>
</div>
(4)總結(jié)
1.一個(gè)事件起泡對應(yīng)觸發(fā)的是上層的同一事件
特殊:如果two設(shè)置成雙擊事件,那么在你單擊two的時(shí)候就會起泡觸發(fā)one單擊的事件
?。p擊包含單擊)。
2.如果在click事件中,在你要處理的事件之前加上e.preventDefault();
那么就取消了行為(通俗理解:相當(dāng)于做了個(gè)return操作),不執(zhí)行之后的語句了。
3.e.stopPropagation()只要在click事件中,就不會觸發(fā)上層click事件。
首先你要明白一點(diǎn),當(dāng)一個(gè)事件發(fā)生的時(shí)候,該事件總是有一個(gè)事件源,即引發(fā)這個(gè)事件的對象,一個(gè)事件不能憑空產(chǎn)生,這就是事件的發(fā)生。
當(dāng)事件發(fā)生后,這個(gè)事件就要開始傳播。為什么要傳播呢?因?yàn)槭录幢旧聿]有處理事件的能力。例如我們點(diǎn)擊一個(gè)按鈕時(shí),就會產(chǎn)生一個(gè)click事件,但這個(gè)按鈕本身不能處理這個(gè)事件(廢話),事件必須從這個(gè)按鈕傳播出去,從而到達(dá)能夠處理這個(gè)事件的代碼中(例如我們給按鈕的onclick屬性賦一個(gè)函數(shù)的名字,就是讓這個(gè)函數(shù)去處理該按鈕的click事件)。
當(dāng)事件在傳播過程中,找到了一個(gè)能夠處理它的函數(shù),這時(shí)候我們就說這個(gè)函數(shù)捕捉到了這個(gè)事件。
說到這里,關(guān)鍵的問題來了,那就是一個(gè)函數(shù)是如何捕捉一個(gè)事件的呢?這就涉及到事件的冒泡了。
為了更好地理解冒泡的概念,我建議你現(xiàn)在想象一下你的面前放著一杯水,但這杯水和我們平時(shí)看到的有點(diǎn)點(diǎn)不同,它分為數(shù)層,每一層又分成一或多個(gè)區(qū)域,最頂層是我們熟悉的窗口對象(即window對象),下一層分為好幾個(gè)區(qū)域(document對象、history對象等等),而document對象的下一層又分為多個(gè)子對象。
這些對象的層次關(guān)系構(gòu)成了DOM中的對象樹。
事件的傳播是有方向的,當(dāng)點(diǎn)擊一個(gè)按鈕時(shí)所產(chǎn)生的事件從這個(gè)按鈕處開始向上傳播(就像一個(gè)水泡從杯底冒上來,這就是之所以叫事件冒泡的原因),但這個(gè)事件總是尋找特定的屬性是否有值。例如按鈕的click事件先尋找在按鈕上是否有onclick屬性的有意義的定義(即該屬性指向一個(gè)存在的函數(shù)或一段可執(zhí)行的語句),如果有,執(zhí)行這個(gè)函數(shù)或語句;然后事件繼續(xù)向上傳播,到達(dá)按鈕的上一層對象(例如一個(gè)form對象或document對象,總之是包含了按鈕的父對象),如果該對象也定義了onclick屬性,則執(zhí)行屬性的值。
所以,如果這個(gè)按鈕上面有3層(form、document、window),且這三層都定義了onclick屬性,則當(dāng)按鈕的click事件產(chǎn)生時(shí),將會調(diào)用4個(gè)(包括按鈕本身的一個(gè))函數(shù)或執(zhí)行4段語句。
事件的這幾個(gè)特性在0級dom中也是適用的。
(2)jquery阻止事件起泡實(shí)例
1、通過返回false來取消默認(rèn)的行為并阻止事件起泡。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function() {
return false;
}
);
2、通過使用 preventDefault() 方法只取消默認(rèn)的行為。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function(event){
event.preventDefault();
}
);
3、通過使用 stopPropagation() 方法只阻止一個(gè)事件起泡。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function(event){
event.stopPropagation();
}
);
(3)關(guān)于js事件起泡的驗(yàn)證
今天這個(gè)問題主要涉及到幾個(gè)關(guān)鍵詞:對象,觸發(fā)事件,捕獲事件,執(zhí)行處理、起泡。這其實(shí)就是整個(gè)js執(zhí)行的過程。其中冒泡這個(gè)過程很有意思。其實(shí)就像是一杯水,但是這杯水是分層次的,最底下是當(dāng)前觸發(fā)事件的對象。然后越往上范圍越大,最頂層肯定是window,倒數(shù)第二層是document。氣泡在上浮過程中會判斷當(dāng)前所到達(dá)的層有沒有綁定事件處理方法。有話就執(zhí)行相應(yīng)的處理。沒有的話就繼續(xù)起泡。直到到達(dá)最頂層的window窗口層。我們可以在任何一層做相應(yīng)的處理以阻止事件繼續(xù)起泡。方法就是調(diào)用事件對象的阻止起泡的方法。event.stopPropagation();下面是寫的一個(gè)驗(yàn)證js事件起泡的過程方法。
復(fù)制代碼 代碼如下:
<script type="text/javascript">
$(document).ready(function(){
$('.one').click(function(e){
alert('one');
});
$('.two').click(function(e){
alert('two');
});
$('.three').click(function(e){
alert('three');
//阻止起泡取消下面的注釋
// e.stopPropagation();
});
});
</script>
<div class="one" style="width:200px;height:200px;background:green;">
one
<div class="two" style="width:150px;height:150px;background:yellow;">
two
<div class="three">
three
</div>
</div>
</div>
(4)總結(jié)
1.一個(gè)事件起泡對應(yīng)觸發(fā)的是上層的同一事件
特殊:如果two設(shè)置成雙擊事件,那么在你單擊two的時(shí)候就會起泡觸發(fā)one單擊的事件
?。p擊包含單擊)。
2.如果在click事件中,在你要處理的事件之前加上e.preventDefault();
那么就取消了行為(通俗理解:相當(dāng)于做了個(gè)return操作),不執(zhí)行之后的語句了。
3.e.stopPropagation()只要在click事件中,就不會觸發(fā)上層click事件。
您可能感興趣的文章:
- jQuery事件綁定和委托實(shí)例
- 關(guān)于jQuery新的事件綁定機(jī)制on()的使用技巧
- jQuery事件綁定on()、bind()與delegate() 方法詳解
- jQuery事件綁定與解除綁定實(shí)現(xiàn)方法
- 淺談jQuery事件綁定原理
- jQuery的三種bind/One/Live/On事件綁定使用方法
- jQuery事件綁定on()與彈窗實(shí)現(xiàn)代碼
- jquery 事件冒泡的介紹以及如何阻止事件冒泡
- Jquery阻止事件冒泡 event.stopPropagation
- jquery取消事件冒泡的三種方法(推薦)
- jQuery事件綁定和解綁、事件冒泡與阻止事件冒泡及彈出應(yīng)用示例
相關(guān)文章
jQuery實(shí)現(xiàn)簡易的輸入框字?jǐn)?shù)計(jì)數(shù)功能示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)簡易的輸入框字?jǐn)?shù)計(jì)數(shù)功能,結(jié)合實(shí)例形式分析了jQuery針對頁面元素屬性的獲取與計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01使用jquery實(shí)現(xiàn)鼠標(biāo)滑過彈出更多相關(guān)信息層附源碼下載
當(dāng)要在有限的空間展示更多的信息時(shí),我們經(jīng)常會采取鼠標(biāo)滑過彈出更多相關(guān)信息層,提高互動性。尤其可以應(yīng)用在公司照片墻、招聘網(wǎng)站求職者信息展示等等場景,本文給大家分享使用jquery實(shí)現(xiàn)鼠標(biāo)滑過彈出更多相關(guān)信息層附源碼下載,感興趣的朋友參考下2015-11-11EasyUI Combobox設(shè)置默認(rèn)值 獲取text的方法
這篇文章主要介紹了EasyUI Combobox設(shè)置默認(rèn)值 獲取text的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11jquery append()方法與html()方法的區(qū)別及使用介紹
append()方法在被選元素的結(jié)尾插入指定內(nèi)容,html()方法返回或設(shè)置被選元素的內(nèi)容,下面為大家介紹下兩者的區(qū)別及使用2014-08-08學(xué)習(xí)從實(shí)踐開始之jQuery插件開發(fā) 對話框插件開發(fā)
之所以寫下這篇文章,是想將我的想法分享給大家;對于初學(xué)者,我希望他能從這篇文章中獲取對他有用的東西,對于經(jīng)驗(yàn)豐富的開發(fā)者,我希望他能指出我的不足,給我更多的意見和建議;目的就是共同進(jìn)步2012-04-04jQuery-ui引入后Vs2008的無智能提示問題解決方法
引入jQuery-vsdoc文件后,jQuery庫就能智能提示了,解決方法很簡單在jQuery-ui的目錄下再加入一個(gè)空的JS文件,命名jquery-ui-vsdoc.js2014-02-02