第一種event.stopPropagation(); 阻止事件冒泡
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括漢壽網(wǎng)站建設(shè)、漢壽網(wǎng)站制作、漢壽網(wǎng)頁(yè)制作以及漢壽網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,漢壽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到漢壽省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
第二種event.preventDefault() 阻止默認(rèn)事件的冒泡
在一個(gè)對(duì)象上觸發(fā)某類事件(比如單擊onclick事件),如果此對(duì)象定義了此事件的處理程序,那么此事件就會(huì)調(diào)用這個(gè)處理程序,如果沒(méi)有定義此事件處理程序或者事件返回true,那么這個(gè)事件會(huì)向這個(gè)對(duì)象的父級(jí)對(duì)象傳播,從里到外,直至它被處理(父級(jí)對(duì)象所有同類事件都將被激活),或者它到達(dá)了對(duì)象層次的最頂層,即document對(duì)象(有些瀏覽器是window)。所以有些時(shí)候需要阻止冒泡。
工具原料:編輯器、瀏覽器
方式一:event.stopPropagation();
$("#div1").mousedown(function(event){
event.stopPropagation();
});
方式二:return false;
$("#div1").mousedown(function(event){
return?false;
});
但是這兩種方式是有區(qū)別的。return false 不僅阻止了事件往上冒泡,而且阻止了事件本身。event.stopPropagation() 則只阻止事件往上冒泡,不阻止事件本身。
(1)什么是事件起泡
首先你要明白一點(diǎn),當(dāng)一個(gè)事件發(fā)生的時(shí)候,該事件總是有一個(gè)事件源,即引發(fā)這個(gè)事件的對(duì)象,一個(gè)事件不能憑空產(chǎn)生,這就是事件的發(fā)生。
當(dāng)事件發(fā)生后,這個(gè)事件就要開(kāi)始傳播。為什么要傳播呢?因?yàn)槭录幢旧聿](méi)有處理事件的能力。例如我們點(diǎn)擊一個(gè)按鈕時(shí),就會(huì)產(chǎn)生一個(gè)click事件,但這個(gè)按鈕本身不能處理這個(gè)事件(廢話),事件必須從這個(gè)按鈕傳播出去,從而到達(dá)能夠處理這個(gè)事件的代碼中(例如我們給按鈕的onclick屬性賦一個(gè)函數(shù)的名字,就是讓這個(gè)函數(shù)去處理該按鈕的click事件)。
當(dāng)事件在傳播過(guò)程中,找到了一個(gè)能夠處理它的函數(shù),這時(shí)候我們就說(shuō)這個(gè)函數(shù)捕捉到了這個(gè)事件。
說(shuō)到這里,關(guān)鍵的問(wèn)題來(lái)了,那就是一個(gè)函數(shù)是如何捕捉一個(gè)事件的呢?這就涉及到事件的冒泡了。
為了更好地理解冒泡的概念,我建議你現(xiàn)在想象一下你的面前放著一杯水,但這杯水和我們平時(shí)看到的有點(diǎn)點(diǎn)不同,它分為數(shù)層,每一層又分成一或多個(gè)區(qū)域,最頂層是我們熟悉的窗口對(duì)象(即window對(duì)象),下一層分為好幾個(gè)區(qū)域(document對(duì)象、history對(duì)象等等),而document對(duì)象的下一層又分為多個(gè)子對(duì)象。
這些對(duì)象的層次關(guān)系構(gòu)成了DOM中的對(duì)象樹(shù)。
事件的傳播是有方向的,當(dāng)點(diǎn)擊一個(gè)按鈕時(shí)所產(chǎn)生的事件從這個(gè)按鈕處開(kāi)始向上傳播(就像一個(gè)水泡從杯底冒上來(lái),這就是之所以叫事件冒泡的原因),但這個(gè)事件總是尋找特定的屬性是否有值。例如按鈕的click事件先尋找在按鈕上是否有onclick屬性的有意義的定義(即該屬性指向一個(gè)存在的函數(shù)或一段可執(zhí)行的語(yǔ)句),如果有,執(zhí)行這個(gè)函數(shù)或語(yǔ)句;然后事件繼續(xù)向上傳播,到達(dá)按鈕的上一層對(duì)象(例如一個(gè)form對(duì)象或document對(duì)象,總之是包含了按鈕的父對(duì)象),如果該對(duì)象也定義了onclick屬性,則執(zhí)行屬性的值。
所以,如果這個(gè)按鈕上面有3層(form、document、window),且這三層都定義了onclick屬性,則當(dāng)按鈕的click事件產(chǎn)生時(shí),將會(huì)調(diào)用4個(gè)(包括按鈕本身的一個(gè))函數(shù)或執(zhí)行4段語(yǔ)句。
事件的這幾個(gè)特性在0級(jí)dom中也是適用的。
(2)jquery阻止事件起泡實(shí)例
1、通過(guò)返回false來(lái)取消默認(rèn)的行為并阻止事件起泡。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function() {
return false;
}
);
2、通過(guò)使用 preventDefault() 方法只取消默認(rèn)的行為。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function(event){
event.preventDefault();
}
);
3、通過(guò)使用 stopPropagation() 方法只阻止一個(gè)事件起泡。
jQuery 代碼:
復(fù)制代碼 代碼如下:
$("form").bind(
"submit",
function(event){
event.stopPropagation();
}
);
(3)關(guān)于js事件起泡的驗(yàn)證
今天這個(gè)問(wèn)題主要涉及到幾個(gè)關(guān)鍵詞:對(duì)象,觸發(fā)事件,捕獲事件,執(zhí)行處理、起泡。這其實(shí)就是整個(gè)js執(zhí)行的過(guò)程。其中冒泡這個(gè)過(guò)程很有意思。其實(shí)就像是一杯水,但是這杯水是分層次的,最底下是當(dāng)前觸發(fā)事件的對(duì)象。然后越往上范圍越大,最頂層肯定是window,倒數(shù)第二層是document。氣泡在上浮過(guò)程中會(huì)判斷當(dāng)前所到達(dá)的層有沒(méi)有綁定事件處理方法。有話就執(zhí)行相應(yīng)的處理。沒(méi)有的話就繼續(xù)起泡。直到到達(dá)最頂層的window窗口層。我們可以在任何一層做相應(yīng)的處理以阻止事件繼續(xù)起泡。方法就是調(diào)用事件對(duì)象的阻止起泡的方法。event.stopPropagation();下面是寫的一個(gè)驗(yàn)證js事件起泡的過(guò)程方法。
復(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è)事件起泡對(duì)應(yīng)觸發(fā)的是上層的同一事件
特殊:如果two設(shè)置成雙擊事件,那么在你單擊two的時(shí)候就會(huì)起泡觸發(fā)one單擊的事件
(雙擊包含單擊)。
2.如果在click事件中,在你要處理的事件之前加上e.preventDefault();
那么就取消了行為(通俗理解:相當(dāng)于做了個(gè)return操作),不執(zhí)行之后的語(yǔ)句了。
3.e.stopPropagation()只要在click事件中,就不會(huì)觸發(fā)上層click事件。
$("#Map #a2).氣泡.hide();
$("#Map #a).氣泡.show();
基本的思路是這樣的。你可以設(shè)置一個(gè)全局的變量存儲(chǔ)現(xiàn)在冒泡的ID,這樣會(huì)更方便一些。
你現(xiàn)在這么寫是有問(wèn)題的
每次點(diǎn)擊a都會(huì)給b綁定一個(gè)事件
當(dāng)你點(diǎn)第二次a時(shí) b就有了2個(gè)alert事件 所以會(huì)執(zhí)行2次
如果你想建立依賴關(guān)系 ?可以換種思路
不妨通過(guò)一個(gè)flag 來(lái)保存a的點(diǎn)擊狀態(tài)
當(dāng)a點(diǎn)擊過(guò) 則b的點(diǎn)擊要執(zhí)行的代碼生效
var?aClicked?=?false?;
$(".a").click(function(){
alert("a");
aClicked?=?true;
});
$(".b").click(function(){
//?這樣來(lái)建立依賴關(guān)系
if(aClicked){
alert("b");
}
});
1、延時(shí)綁定事件功能不同:
jquery $('#btn').click在文檔流中,后續(xù)通過(guò)腳本動(dòng)態(tài)添加的元素(符合 id="#btn"),是沒(méi)有綁定click事件的。
$("#btn").live("click",function()后續(xù)通過(guò)腳本動(dòng)態(tài)添加的元素(符合 id="#btn"),也是綁定了click事件的。如何使用 live() 方法向尚未創(chuàng)建的元素添加事件處理器。
live()可以將事件綁定到當(dāng)前和將來(lái)的元素(eg:為id=zy元素綁定點(diǎn)擊事件,而當(dāng)用js動(dòng)態(tài)生成一個(gè)節(jié)點(diǎn)并插入到dom文檔結(jié)構(gòu)中時(shí),如果是用bind()綁定的,怎么新插入的節(jié)點(diǎn)將不會(huì)有該bind綁定事件。而live()則可以);
2、綁定方式不同:
.live()則是通過(guò)冒泡的方式來(lái)綁定到元素上的。更適合列表類型的,綁定到DOM節(jié)點(diǎn)上。而click()是直接綁定在元素上。
3、底層API支持不同:
click()方法:在jqeury事件處理API中,bind()是其API基礎(chǔ)。click(),mouseover(),mousermove等來(lái)處理事件,真正起作用的是bind()。而這些方法都只是輔助作用(別名函數(shù)),簡(jiǎn)化使用。都只有一個(gè)參數(shù)(觸發(fā)事件時(shí)執(zhí)行的回調(diào)函數(shù))。live()不同,不依賴bind()API。
參考資料來(lái)源:jQuery-.click()
參考資料來(lái)源:jQuery-.live()