新聞中心
jQuery事件冒泡及解決辦法
什么是事件冒泡:在一個(gè)對(duì)象上觸發(fā)某類(lèi)事件(比如onclick事件),如果次對(duì)象定義了此事件的處理程序,那么此事件就會(huì)調(diào)用這個(gè)處理程序,如果沒(méi)有定義此事件處理程序或者事件返回true,那么這個(gè)事件會(huì)向這個(gè)對(duì)象的父級(jí)對(duì)象傳播,從里到外,直至它被處理(父級(jí)對(duì)象所有同類(lèi)事件都將被激活),或者它到達(dá)了對(duì)象層次的最頂層,即document對(duì)象(有些瀏覽器是window)。
成都創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的達(dá)坂城網(wǎng)站建設(shè)公司,達(dá)坂城接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行達(dá)坂城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
事件冒泡的作用:事件冒泡允許多個(gè)操作被集中處理(把事件處理器添加到一個(gè)父級(jí)元素上,避免把事件處理器添加到多個(gè)子級(jí)元素上),它還可以讓你在對(duì)象層的不同級(jí)別捕獲事件。
阻止事件冒泡:事件冒泡機(jī)制有時(shí)候是不需要的,需要阻止掉,通過(guò) event.stopPropagation() 來(lái)阻止
$(function(){
})
代合并阻止操作:實(shí)際開(kāi)發(fā)中,一般把阻止冒泡和阻止默認(rèn)行為合并起來(lái)寫(xiě),合并寫(xiě)法可以用.
// event.stopPropagation();
// event.preventDefault();
// 合并寫(xiě)法:
return false;
事件委托就是利用冒泡的原理,把事件加到父級(jí)上,通過(guò)判斷事件來(lái)源的子集,執(zhí)行相應(yīng)的操作,事件委托首先可以極大減少事件綁定次數(shù),提高性能;其次可以讓新加入的子元素也可以擁有相同的操作。
一般綁定事件的寫(xiě)法:bind
事件委托的寫(xiě)法:
如果我們要取消事件的委托:
//ev.delegateTarge 委托的對(duì)象
$(ev.delegateTarge).undelegatee();
//如果是上面的兩種例子可使用//$list.undelegate();
創(chuàng)建節(jié)點(diǎn): ('div')
var ('div這是一個(gè)div元素/div');
插入節(jié)點(diǎn):
1、append()和appendTo():在現(xiàn)存元素的內(nèi)部,從后面插入元素
2、prepend()和prependTo():在現(xiàn)存元素的內(nèi)部,從前面插入元素
3、after()和insertAfter():在現(xiàn)存元素的外部,從后面插入元素
4、before()和insertBefore():在現(xiàn)存元素的外部,從前面插入元素
刪除節(jié)點(diǎn)
$('#div1').remove();
js 在阻止默認(rèn)事件的同時(shí)不影響滾動(dòng)條
js阻止默認(rèn)事件的方式有兩種:
使用e.preventDefault()方法,例子如下 ?
/**
* 1.阻止元素的默認(rèn)事件,但是不會(huì)阻止事件冒泡
*/
var link = document.getElementsByTagName('a')[0];
link.addEventListener('click',function(e){
? ????e.preventDefault();
});
2.如果是在jquery中,可以使用return false,例子如下:
/**
* 2.阻止元素的事件冒泡
* Jquery和原生的Js在這點(diǎn)上有些不同,
* 原生的Js要通過(guò)e.stopPropagation()方法阻止事件冒泡
* 而Jquery則可以直接return false;來(lái)阻止事件冒泡
* e.stopPropagation()方法不會(huì)阻止元素的默認(rèn)行為,但是
* return false;會(huì)阻止元素的默認(rèn)行為。
*/
var btn = document.getElementById('btn');
btn.addEventListener('click',function(e){
return false;
});
事件冒泡是什么如何用jquery阻止事件冒泡
(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();下面是寫(xiě)的一個(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事件。
如何禁用a標(biāo)簽,是禁用事件,而不是什么阻止跳轉(zhuǎn)之類(lèi)的
你指的是禁用默認(rèn)事件?
a?href="baidu.com"百度/a
1.jQuery 阻止默認(rèn)事件
$("a").click(function(?event?)?{
event.preventDefault();?//?阻止默認(rèn)事件
event.stopPropagation();?//?阻止冒泡
});
2.javascript?
var?elem?=?document.getElementByTagName("a");
elem.addEventListener("click",function(event){
event.preventDefault();?//?阻止默認(rèn)事件
event.stopPropagation();?//?阻止冒泡
},false);
說(shuō)明:
preventDefault();???//?阻止默認(rèn)事件
stopPropagation();??//?阻止冒泡
return?false;???//?既阻止默認(rèn)事件?也阻止冒泡
jquery事件對(duì)象event有哪些屬性和方法
1.event.type屬性
該方法作用是可以獲取到時(shí)間的類(lèi)型。
2.event.preventDefault()方法
該方法的作用是阻止默認(rèn)的事件行為。JavaScript中符合W3C規(guī)范的preventDefault()方法在IE瀏覽器中無(wú)效。jQuery對(duì)其進(jìn)行了封裝,使之能兼容各種瀏覽器。
3.event.stopPropagation()方法
該方法是阻止事件的冒泡。JavaScript中符合W3C規(guī)范的stopPropagation()方法在IE瀏覽器中無(wú)效。jQuery對(duì)其進(jìn)行封裝,使之能兼容各種瀏覽器。
4.event.target屬性
event.target屬性的作用是獲取到出發(fā)事件的元素。jQuery對(duì)其封裝后,避免了W3C、IE和safari瀏覽器不同標(biāo)準(zhǔn)的差異。
5.event.relatedTarget屬性
在標(biāo)準(zhǔn)DOM中,mouseover和mouseout所發(fā)生的元素可以通過(guò)event.target()方法來(lái)訪問(wèn),相關(guān)元素是通過(guò)event.relatedTarget屬性來(lái)訪問(wèn)的。event.relatedTarget屬性在mouseover中相當(dāng)于IE瀏覽器的event.fromElement屬性,在mouseout中相當(dāng)于IE瀏覽器的event.toElement,jQuery對(duì)其進(jìn)行了封裝,使之能兼容各種瀏覽器。
6.event.pageX/event.pageY屬性
該方法的作用是獲取到光標(biāo)相對(duì)頁(yè)面的x坐標(biāo)和y坐標(biāo)。如果沒(méi)有使用jQuery時(shí),那么IE瀏覽器中是用event/event.y方法,而在Firefox瀏覽器中用event.pageX/event.pageY方法。如果頁(yè)上有滾動(dòng)條,則還要加上滾動(dòng)條的寬度和高度。在IE瀏覽器中還應(yīng)該減去默認(rèn)的2px的邊框。
7.event.which屬性
該方法的作用是在鼠標(biāo)單擊事件中獲取到鼠標(biāo)的左、中、右鍵;在鍵盤(pán)事件中獲取鍵盤(pán)的按鈕。
8.event.metaKey屬性
針對(duì)不同瀏覽器對(duì)鍵盤(pán)中的ctrl按鍵解釋不同,jQuery也進(jìn)行了封裝,并規(guī)定event.metaKey()方法為鍵盤(pán)事件中獲取ctrl按鍵。
9.event.originalEvent屬性。
該方法的作用是指向原始的事件對(duì)象。
網(wǎng)站欄目:jquery阻止默認(rèn)事件,jquery禁止點(diǎn)擊事件
URL標(biāo)題:http://www.dlmjj.cn/article/dsggdid.html