2011-08-17 39 views
11

我綁定到鏈路(通過使用jQuery的.live()功能)click事件,然後手動用純JS和HTML(像<a href="".... onclick="some action">)添加onclick事件處理程序。我想防止事件冒泡到live方法,但我不知道如何。stopPropagation而不jQuery的

也許e.stopPropagation()在這種情況下很有幫助,但添加了onclick的事件處理函數是用純JS編寫的,我不能從jQuery元素包裝外部調用stopPropagation()。在這種情況下return false不起作用。我試圖用$.Event('click').stopPropagation()替代return false,但我認爲這是錯誤的,因爲它不起作用。

如何防止冒泡到live()方法沒有jQuery包裝?

回答

2

使用.live,您無法停止傳播。這是因爲在.live中,事件處理程序綁定到DOM樹的根。因此,在處理程序可以被調用之前,事件必須冒泡到最高的元素。其中一個關於使用.live的警告。

考慮使用.delegate(如果您希望處理程序持續存在)或使用.bind代替。

如果你想活的處理程序被完全地禁用,使用模具:

$("#myHref").die("click", aClick); // this will remove any existing event handlers 
$("#myHref").click(yourhandler); // add your handler 

Demo 1: JsFiddle 1

或者,添加內嵌處理程序(並從那裏取消事件):

<a href=".." onclick="yourhandler"> 

Demo 2: JsFiddle 2

內嵌處理程序將b在任何jQuery事件處理程序之前,都會首先調用它。

+0

我無法更改通過.live綁定的代碼。有沒有辦法解決這個問題? – abonec

+0

但是可以從綁定到元素的另一個事件處理程序停止事件。 –

+0

僅當該事件處理程序首先註冊時。 jQuery會排隊他們,對吧? – Mrchief

13

我是在假設return false在「正常」事件處理程序阻止事件冒泡以及but I was wrong(感謝@Mrchief)。

還有其他的方法來雖然停止,作爲quirksmode.org描述:

function doSomething(e) 
{ 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 

cancelBubble是IE瀏覽器,在所有的W3C兼容的瀏覽器stopPropagation作品。

+0

即使我幾周前才知道! – Mrchief

+0

當我嘗試獲取有關事件的任何信息時(onclick「alert(window.event)」),當我單擊時,它會顯示警告「未定義」。 – abonec

+1

@Abonec:'window.event'僅在IE(和Chrome)中可用。在其他瀏覽器中,事件對象作爲參數傳遞給事件處理程序。 –