2014-07-21 115 views
0

在我的導航菜單中,我有一個我想要使用的下拉菜單。實際的下降很好,我已經通過使用preventDefault();阻止了自動冒泡,但現在下拉菜單中的所有鏈接都不再起作用。preventDefault,但激活鏈接

我該如何使下拉工作,不會出現泡泡和下拉菜單中的所有鏈接?

編輯:我也使用event.stopPropagation()也沒有效果。這裏發生了什麼?!

這是我的代碼:

// Toggle dropdowns 
$('.menu-item-has-children').click(function(e){ 
    e.preventDefault(); 
    $(this).find('.sub-menu').toggleClass('open'); 
}); 
+0

你能分享html示例 –

+0

'preventDefault!== stopPropagation' – undefined

+0

有關詳細信息,請訪問http://stackoverflow.c om/questions/5963669 /事件停止傳播和事件防止默認情況下的差異 –

回答

3

要停止冒泡,使用event.stopPropagation()

只能使用event.preventDefault()來防止事件的默認動作發生。


啊,現在我看到你的問題了。問題是,當點擊一個菜單項來打開一個子菜單時,由於該項目是一個指向#的錨,文檔將滾動到頂部。

爲了避免這種情況,我建議擺脫href="#"

或者,你可以使用preventDefault只有在點擊的元素是元素,而不是一個後代:

$('.menu-item-has-children').on('click', function(e){ 
    if(this == e.target) e.stopPropagation(); 
    // ... 
}); 

Demo

+0

不幸的是,使用stopPropagation()不會停止捕捉到屏幕的頂部。它確實激活了鏈接 – patkay

+0

@patkay你可以發佈一個小提琴來顯示這種行爲嗎? – Oriol

+0

這有點大雜燴,但希望它足以讓你看看。 http://jsfiddle.net/KQF9Z/ – patkay

0

您可以檢查被點擊了哪個元素使用e.target,如果被點擊的元素是一個子菜單鏈接,不妨礙默認

+0

對不起,我有點jquery newb。我將如何去做這件事?你能告訴我一些示例代碼嗎? – patkay

+0

沒問題。這是粗糙的,但會給你一個你需要做什麼的想法 $('。menu-item-has-children')。click(function(e){ //檢查點擊的項目是否(!($(e.target).parents('ul')。hasClass('sub-menu'))){ \t e。沒有父ul並且有子菜單調用 。preventDefaul(); ('。sub-menu')。toggleClass('open'); } }); 藉口格式化,無法獲取堆棧溢出以允許格式化 –