2011-09-16 33 views
7

當我使用.bind來綁定子項和父項的事件時,子項事件可以用返回false來停止事件傳播;但是當我使用委託時,返回false;不會停止事件傳播。如何在使用委託時停止事件傳播?

http://jsfiddle.net/J3EAQ/

HTML:

<div class="parent"> 
    <div class="child"></div> 
    <div class="child"></div> 
</div> 

JS:

$('.parent').delegate('.child','click',function(e){ 
    alert('child click'); 
    return false; 
}); 
$('.parent').bind('click',function(e){ 
    alert('parent click'); 
}); 
+0

可能重複? http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false –

回答

1

您應該使用e.stopPropagation(),以防止傳播,而不是返回false。

return false從技術上講是兩件事; 1)防止默認動作,2)停止傳播。嘗試切換到e上的方法調用,看看是否可以解決您的問題。

+0

仍然沒有解決這個問題 –

+0

@Interstellar_Coder - 正確,你的解決方案更好。從來不知道'stopImmediatePropagation()'。謝謝! – Tejs

4

爲什麼兩個click處理程序時,你可以有一個:

$('.parent').click(function (e) { 
    if ($(e.target).is('.child')) { 
     alert('child click'); 
    } else { 
     alert('parent click'); 
    }  
}); 

現場演示:http://jsfiddle.net/J3EAQ/2/


這種模式的推廣:

$(element).click(function (e) { 
    if (e.target === this) { 
     // this element was clicked directly 
    } else { 
     // this element was NOT clicked directly 
     // a descendant of this element was clicked 
    }  
}); 

獨立的句柄?

$('.parent').click(function (e) { 
    if (this ==== e.target) { 
     parentClicked.call(e.target, e); 
    } else { 
     childClicked.call(e.target, e); 
    }  
}); 

function childClicked(e) { 
    // child click handler 
} 

function parentClicked(e) { 
    // parent click handler 
} 
+0

在技術上它解決了問題,但我喜歡分離不同元素的功能,所以我需要一個帶有2個事件處理程序的解決方案。 – codez

+0

然後不要使用'.delegate',只需在兩個地方使用'.click'。 – Blazemonger

+0

@codez你也可以。查看我的更新。 –

0

您可以隨時使用e.stopPropagation()

+0

不起作用:http://jsfiddle.net/J3EAQ/3/ – codez

-1

您的活動不被傳播。您正在綁定點擊處理程序到.parent,並且您正在點擊.parent

0

對我來說,工作原理是在點擊處理程序中檢查點擊目標的類名,你不想被其他點擊事件觸發。像這樣的東西。

if(e.target.className.toString().indexOf("product-row") > -1){ 
     // Only do stuff if the correct element was clicked 
    }