jQuery 事件隊(duì)列調(diào)整方法
更新時(shí)間:2009年09月18日 14:42:17 作者:
如何為已經(jīng)綁定A事件的對(duì)象添加B事件,由B事件判斷A事件是否觸發(fā)
大家都發(fā)現(xiàn),通過(guò)jQuery綁定事件是件非常容易的事情
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
console.info("A");
return false;
});
</TEXTAREA>
但是A事件綁定后,我發(fā)現(xiàn)我需要B事件來(lái)決定其是否觸發(fā),好辦,現(xiàn)在就改。
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
console.info("B");
return false;
});
$("a").click(function(){
console.info("A");
return false;
});
</TEXTAREA>
真的能夠阻止后面的click事件觸發(fā)嗎?事與愿違。
如果B事件需要通過(guò)異步調(diào)用來(lái)判斷A事件是否需要觸發(fā)呢?
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
$.ajax({
url:"b.html",
success:function(msg){
if(msg){
console.info("pass");
return true;
}else{
console.info("nopass");
return false;
}
}
});
});
$("a").click(function(){
console.info("B");
return false;
});
</TEXTAREA>
事實(shí)發(fā)現(xiàn)根本不可能,那怎么辦呢?
先說(shuō)幾種思路:
將后綁定的事件通過(guò)另外一種觸發(fā),比如A事件是綁定在click上,那么B事件綁定在mouseover上,先觸發(fā)mouseover再通過(guò)它來(lái)阻止click事件。(后來(lái)經(jīng)過(guò)研究,發(fā)現(xiàn)這幾乎是不可能的事情)
將2個(gè)事件通過(guò)jquery的queue進(jìn)行處理。(這個(gè)確實(shí)可以解決先后觸發(fā)的問(wèn)題,但是現(xiàn)實(shí)的情況是項(xiàng)目中所有的事件綁定已經(jīng)全部寫(xiě)好,目前需要每個(gè)按鈕事件前都加上1個(gè)判斷的AJAX請(qǐng)求。要不就是所有的按鈕事件全部重寫(xiě),要么另外尋找一條路)
深入jQuery的事件機(jī)制,獲得其事件的隊(duì)列,針對(duì)其事件隊(duì)列進(jìn)行處理。
<TEXTAREA class=javascript name=code rows=15 cols=50>//我們先讓其默認(rèn)綁定個(gè)事件,稱(chēng)其為A事件
$("a").click(function(){
console.info(1);
return false;
});
//現(xiàn)在我們要讓后面綁定的B事件先觸發(fā),并且控制A事件是否觸發(fā)
//獲取對(duì)象a綁定的事件對(duì)象中的click事件
var event = $("a").data("events").click;
//因?yàn)檫@個(gè)a在我們的B事件中也需要用到,為了防止this對(duì)象的改變,因此特地聲明變量that保存
var that = $("a");
//下面就是B事件了,但是貌似好像沒(méi)有綁定啊
var B = function(){
$.ajax({
url:"b.html",
success:function(msg){
if(msg){
console.info("pass");
tt.call(that);
}else{
console.info("nopass");
}
}
});
return false;
};
//關(guān)鍵對(duì)象,盡請(qǐng)對(duì)其多關(guān)注
var tt;
//關(guān)鍵代碼,盡請(qǐng)多關(guān)注
for(var i in event){
tt = event[i];
event[i] = B;//如果注釋此行,下面2行必須取消注釋。效果一樣,原理不同...
//delete(event[i]);
//that.click(B);
break;
}
</TEXTAREA>
問(wèn)題貌似圓滿(mǎn)解決,但是AJAX的callback函數(shù)中的return,是否可以抓的到呢?
復(fù)制代碼 代碼如下:
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
console.info("A");
return false;
});
</TEXTAREA>
但是A事件綁定后,我發(fā)現(xiàn)我需要B事件來(lái)決定其是否觸發(fā),好辦,現(xiàn)在就改。
復(fù)制代碼 代碼如下:
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
console.info("B");
return false;
});
$("a").click(function(){
console.info("A");
return false;
});
</TEXTAREA>
真的能夠阻止后面的click事件觸發(fā)嗎?事與愿違。
如果B事件需要通過(guò)異步調(diào)用來(lái)判斷A事件是否需要觸發(fā)呢?
復(fù)制代碼 代碼如下:
<TEXTAREA class=javascript name=code rows=15 cols=50>$("a").click(function(){
$.ajax({
url:"b.html",
success:function(msg){
if(msg){
console.info("pass");
return true;
}else{
console.info("nopass");
return false;
}
}
});
});
$("a").click(function(){
console.info("B");
return false;
});
</TEXTAREA>
事實(shí)發(fā)現(xiàn)根本不可能,那怎么辦呢?
先說(shuō)幾種思路:
將后綁定的事件通過(guò)另外一種觸發(fā),比如A事件是綁定在click上,那么B事件綁定在mouseover上,先觸發(fā)mouseover再通過(guò)它來(lái)阻止click事件。(后來(lái)經(jīng)過(guò)研究,發(fā)現(xiàn)這幾乎是不可能的事情)
將2個(gè)事件通過(guò)jquery的queue進(jìn)行處理。(這個(gè)確實(shí)可以解決先后觸發(fā)的問(wèn)題,但是現(xiàn)實(shí)的情況是項(xiàng)目中所有的事件綁定已經(jīng)全部寫(xiě)好,目前需要每個(gè)按鈕事件前都加上1個(gè)判斷的AJAX請(qǐng)求。要不就是所有的按鈕事件全部重寫(xiě),要么另外尋找一條路)
深入jQuery的事件機(jī)制,獲得其事件的隊(duì)列,針對(duì)其事件隊(duì)列進(jìn)行處理。
復(fù)制代碼 代碼如下:
<TEXTAREA class=javascript name=code rows=15 cols=50>//我們先讓其默認(rèn)綁定個(gè)事件,稱(chēng)其為A事件
$("a").click(function(){
console.info(1);
return false;
});
//現(xiàn)在我們要讓后面綁定的B事件先觸發(fā),并且控制A事件是否觸發(fā)
//獲取對(duì)象a綁定的事件對(duì)象中的click事件
var event = $("a").data("events").click;
//因?yàn)檫@個(gè)a在我們的B事件中也需要用到,為了防止this對(duì)象的改變,因此特地聲明變量that保存
var that = $("a");
//下面就是B事件了,但是貌似好像沒(méi)有綁定啊
var B = function(){
$.ajax({
url:"b.html",
success:function(msg){
if(msg){
console.info("pass");
tt.call(that);
}else{
console.info("nopass");
}
}
});
return false;
};
//關(guān)鍵對(duì)象,盡請(qǐng)對(duì)其多關(guān)注
var tt;
//關(guān)鍵代碼,盡請(qǐng)多關(guān)注
for(var i in event){
tt = event[i];
event[i] = B;//如果注釋此行,下面2行必須取消注釋。效果一樣,原理不同...
//delete(event[i]);
//that.click(B);
break;
}
</TEXTAREA>
問(wèn)題貌似圓滿(mǎn)解決,但是AJAX的callback函數(shù)中的return,是否可以抓的到呢?
您可能感興趣的文章:
- jQuery隊(duì)列控制方法詳解queue()/dequeue()/clearQueue()
- jQuery中queue()方法用法實(shí)例
- jquery隊(duì)列queue與原生模仿其實(shí)現(xiàn)方法分享
- jQuery中隊(duì)列queue()函數(shù)的實(shí)例教程
- jquery隊(duì)列函數(shù)用法實(shí)例
- 用隊(duì)列模擬jquery的動(dòng)畫(huà)算法實(shí)例
- 利用Jquery隊(duì)列實(shí)現(xiàn)根據(jù)輸入數(shù)量顯示的動(dòng)畫(huà)
- jQuery使用動(dòng)畫(huà)隊(duì)列自定義動(dòng)畫(huà)操作示例
- JQuery中queue方法用法示例
相關(guān)文章
NiftyCube——輕松實(shí)現(xiàn)圓角邊框
這篇文章主要介紹了NiftyCube——輕松實(shí)現(xiàn)圓角邊框2007-02-02
Jquery中增加參數(shù)與Json轉(zhuǎn)換代碼
有時(shí)候,我們需要進(jìn)一步轉(zhuǎn)化為json表達(dá)式,參考Ext中的Ext.urlDecode函數(shù),我們可以實(shí)現(xiàn)一個(gè)相應(yīng)的jquery中使用的函數(shù)。2009-11-11
easyui取消表單實(shí)時(shí)驗(yàn)證,提交時(shí)統(tǒng)一驗(yàn)證的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇easyui取消表單實(shí)時(shí)驗(yàn)證,提交時(shí)統(tǒng)一驗(yàn)證的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
使用jQuery實(shí)現(xiàn)圖片遮罩半透明墜落遮擋
這篇文章主要介紹了使用jQuery實(shí)現(xiàn)圖片遮罩半透明墜落遮擋,效果非常棒,小伙伴們做相冊(cè)的時(shí)候可以直接拿走使用。2015-03-03
使用jquery提交form表單并自定義action的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇使用jquery提交form表單并自定義action的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
關(guān)于html+ashx開(kāi)發(fā)中幾個(gè)問(wèn)題的解決方法
在跟html+ashx打交道的園友們肯定會(huì)發(fā)現(xiàn),這種模式雖然優(yōu)美,但在開(kāi)發(fā)中會(huì)遇到一些難處理的地方。我也不例外,下面是自己在實(shí)際開(kāi)發(fā)中總結(jié)出來(lái)的幾條經(jīng)驗(yàn),希望跟大家分享,更希望得到大家的建議和更好的解決方法!2011-07-07

