2012-04-05 81 views
0

我試圖在用戶單擊div後添加一個$('body').live('click')偵聽器。目的是創建一個自定義下拉框,用戶可以通過點擊頁面上的任何位置打開並最終關閉。在.click()函數中使用.live('click')觸發自己

但是當我添加.click()函數內部.live().bind()功能,live()功能被觸發某種原因:

$('#myDiv').click(function(){ 
    $('#myDiv .child').show().addClass('showing'); 
    $('body').live('click', function(){ 
      $('#myDiv .child').hide(); 
      $('body').die(); 
    }) 
}) 

#myDiv顯示,而是立即隱藏,由揮之不去.showing類證明。

我使用live()錯了嗎?我如何避免這種遞歸?

+0

解釋什麼是你想這樣做,而不是解釋目前自己在做什麼。也許我們可以提供替代方案,而不是修復潛在的錯誤代碼。 – Joseph 2012-04-05 02:47:26

回答

3

return false將停止事件傳播:

$('#myDiv').click(function(){ 
    $('#myDiv .child').show().addClass('showing'); 
    $('body').live('click', function(){ 
      $('#myDiv .child').hide(); 
      $('body').die(); 
    }); 
    return false; 
}) 
+0

謝謝,這也有效,比傳遞一個事件並使用event.stopPropagation()更容易一些。 – podcastfan88 2012-04-05 02:59:02

+0

始終歡迎:-) – 2012-04-05 03:03:10

+2

@stuart - 僅供參考,返回'false'與e.stopPropagation()不完全相同。返回false會導致jQuery同時執行'e.stopPropagation()'和'e.preventDefault()'。在這種情況下,也許對你沒有什麼不同,但你應該明白它不完全一樣。就傳遞給事件處理程序的事件而言,無論您是否聲明參數,它總是傳遞給事件處理程序 - 它始終存在。 – jfriend00 2012-04-05 03:03:25

0

使用第二主體點擊不活的(你也並不需要它,因爲它總是頁面上),並使用超時結合:

$('#myDiv').on('click',function(){ 
    $('#myDiv .child').show().addClass('showing'); 
setTimeout(function(){ 
$('body').on('click', function(){ 
      $('#myDiv .child').hide(); 
      $('body').off('click'); 
    }); 
},0); 

}); 
+0

我的測試顯示這仍然觸發自己:http://jsfiddle.net/GsP5j/1/。我使用'live()',因爲我不希望'$('body')'總是接受點擊事件。 – podcastfan88 2012-04-05 02:49:42

+0

請重新檢查與超時 – Rustam 2012-04-05 02:53:45

+0

變種工作,感謝您的選擇。 – podcastfan88 2012-04-05 03:05:39

0

也許它應該工作,也許它不應該。但事實並非如此。我建議在開始時設置所有事件處理程序,並且只需要一個全局變量(例如)來跟蹤第二個事件處理程序是否應該實際響應。

0

您可能不得不停止當前事件的傳播,以防止其冒泡到新事件處理程序將看到它的正文。此外,你可以使用.one()爲一次性事件處理程序:

$('#myDiv').on('click',function(e){ 
    $('#myDiv .child').show().addClass('showing'); 
    e.stopPropagation(); 
    $(document.body).one('click', function() { 
      $('#myDiv .child').hide(); 
    }); 
}) 
+0

謝謝,這工作!我聽說過關於傳播的問題,但以前從來不需要擔心。 – podcastfan88 2012-04-05 02:54:58