2015-06-11 142 views
0

我沒有自己的代碼,它將一個jQuery委託事件監聽器放置在單擊事件(收集和觸發Omniture數據)上。jQuery委託不同DOM層次結構的事件偵聽器 - 適用的事件偵聽器會觸發嗎?

$("html").on('click', 'a', function() { /* Stuff */ }); 

我已經寫代碼,還需要委派的事件,這樣我就可以執行上的click事件的一些程序的行爲,但我也希望上面的代碼火爲好。

$(".module").on('click', 'a.yes', function(event) { /* My stuff */}); 

當我把我的代碼放入時,我可以清楚地看到我的事件正在發射,但沒有發現其他事件。

此堆棧溢出答案指出,在現代瀏覽器中,事件冒泡。如果事件在上一次遇到事件監聽器,那個級別的處理程序會觸發,但事件繼續冒泡。 https://stackoverflow.com/a/4616720/432089

我沒有得到任何控制檯錯誤,也可能是其他代碼在我的頁面上配置不正確。有人可以證實這個事件會一直泡到頂部,一直激活沿途的任何匹配處理程序嗎? (如果沒有事件處理程序使用event.stopPropagation停止傳播或返回false)

我只想確保充分理解事件冒泡,因此我知道從哪裏開始調試。 (即我的代碼與相關的Omniture代碼)

回答

1

如果你的事件處理程序會那樣做的這兩件事,該事件不會冒泡:

  1. 函數調用event.stopPropagation();
  2. 該函數返回false(特定於jQuery)。

下面的代碼演示了這種行爲:

$("html").on('click', 'a', function() { alert('base'); }); 
 
$(".module").on('click', 'a.yes', function(event) { alert('custom'); }); 
 
$(".module").on('click', 'a.yes2', function(event) { alert('custom2'); return false; });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="module"> 
 
    <a class="yes" href="#">test me</a> 
 
    <a class="yes2" href="#">test me too</a> 
 
</div>

+0

感謝確認。這意味着我不擁有的Omniture代碼沒有正確配置。我很確定我的代碼和Omniture代碼之間沒有其他事件偵聽器可以阻止事件冒泡。 – Stephen

+0

@Stephen如果我沒有弄錯,Omniture代碼應該是最後一個運行..所以它可能不會影響你的代碼。 –

+0

當我查看Chrome開發工具時,我的點擊事件處理程序肯定會觸發。所以,我知道Omniture代碼不會影響我的代碼。我試圖找出爲什麼Omniture代碼沒有被觸發,它可能是一個配置問題(因爲我在CMS的測試頁面上沒有任何東西),或者我的代碼和Omniture之間的一些處理程序已經停止了傳播(不太可能,因爲生產會受到影響)感謝您確認事件傳播是如何工作的,因爲我現在知道在哪裏調試或提出問題。 – Stephen