2009-07-29 33 views
2

所以,你有一個頁面:稱爲頁面的每一個元素jQuery的AJAX事件時只針對一個元素

<html><head> 
<script type="text/javascript" src="jquery.1.3.2.js"></script> 
<script type="text/javascript"> 
$(function() { 
    var onajax = function(e) { alert($(e.target).text()); }; 
    var onclick = function(e) { $(e.target).load('foobar'); }; 
    $('#a,#b').ajaxStart(onajax).click(onclick); 
}); 
</script></head><body> 
<div id="a">foo</div> 
<div id="b">bar</div> 
</body></html> 

你會想到一個警報或兩個當你點擊「富」?我希望只有一個,但我得到兩個。爲什麼一個事件有多個目標?這肯定似乎違反了最不讓人驚訝的原則。我錯過了什麼嗎?有沒有辦法通過事件對象在哪個div上調用load()調用?這肯定會有幫助...

編輯:澄清,點擊的東西只是爲演示。有一個非通用的ajaxStart處理程序是我的目標。我希望div#a做一件事情,當它是ajax事件和div#b做一些不同的事情時。所以,從根本上說,我想能夠告訴哪個div load()在我捕獲ajax事件時被調用。我開始認爲這是不可能的。也許我應該把這與jQuery的開發...

+0

如果divs嵌套,這可能是半意義的,但因爲它們不是這種奇怪的行爲。也許你的CSS是使divs以某種方式重疊? – theGecko 2009-07-29 16:44:36

+0

有趣......看着這個...... – Jason 2009-07-29 16:46:24

+0

沒有css。使用這個確切的代碼,你會得到的效果。 – 2009-07-29 17:32:53

回答

1

好吧,我繼續前進,看着jQuery ajax和事件代碼。 jQuery只在全局觸發ajax事件(沒有目標元素):

jQuery.event.trigger("ajaxStart"); 

沒有其他信息。 :(

所以,當觸發方法得到這樣的調用時,它會通過jQuery.cache查找,並找到所有具有綁定該事件類型和jQuery.event.trigger的處理程序的元素,但這次使用該元素作爲目標。

所以,這正是因爲它出現在演示。當一個實際的AJAX事件發生時,jQuery的觸發每一個元素,這對於該事件的處理程序,勢必非冒泡事件。

所以,我想我不得不遊說他們發送更多的信息以及「ajaxStart」觸發器,當發生load()調用時。

更新:Ariel最近對此表示支持。它應該在jQuery 1.4中(或者他們決定調用下一個版本)。

-1

因爲你有一個選擇器與兩個元素,你正在創建兩個ajaxStart處理程序。 ajaxStart是一個全局事件,所以一旦你觸發任何ajax事件,onajax函數將被調用兩次。所以是的,你會得到兩個彈出窗口。

0

當您設置ajaxStart時,它將關閉兩個div。所以當你設置每個div對ajaxStart事件作出反應時,每當Ajax啓動時,它們都會關閉......

你應該爲每個點擊處理程序和某些通用的事情分別爲你的ajaxStart事件做些事情......

相關問題