2015-03-05 2 views
4

https://jsfiddle.net/aesya0g6/JQuery Расширение Nav Сворачивание на ребенка Нажмите

Здравствуйте!

Я построил расширяющийся навигатор, и он работает точно так, как я хочу, за исключением того факта, что он рушится на щелчке детей. Я попытался переключиться туда, где указывает jQuery, в надежде, что это разрешит его, но не повезло. Где я иду не так?

$('.expandingNav').click(function(){ 
    if($(this).hasClass('expanded')){ 
    $(this).children('.hidden').slideUp(); 
    $(this).removeClass('expanded'); 
    } 
    else{ 
    $(this).children('.hidden').slideDown(); 
    $(this).addClass('expanded'); 
    } 
}); 

ответ

0

При нажатии на ребенке нужного элемента, событие щелчка «пузырится» его родитель, таким образом, инициирующее событие щелчка, который вызывает слайд вверх. Вы должны обработать событие click для детей и использовать stopPropagation, чтобы избежать пузырьков событий. Попробуйте что-то вроде этого:

$('.expandingNav li').click(function(ev) { ev.stopPropagation(); }) 
2

Вы можете проверить, если ближайший ul элемент имеет родительский элемент nav.sidebar:

$('.expandingNav').on('click', function (e) { 
    if ($(e.target).closest('ul').parent('nav.sidebar').length) { 
     // ... 
    } 
}); 

Updated Example

$('.expandingNav').on('click', function (e) { 
    if ($(e.target).closest('ul').parent('nav.sidebar').length) { 
     if ($(this).hasClass('expanded')) { 
      $(this).children('.hidden').slideUp(); 
      $(this).removeClass('expanded'); 
     } else { 
      $(this).children('.hidden').slideDown(); 
      $(this).addClass('expanded'); 
     } 
    } 
}); 

В качестве альтернативы, вы также можете проверить увидеть, если следующий брат родительского элемента является ul элемент:

$('.expandingNav').on('click', function (e) { 
    if ($(e.target).parent().next('ul').length) { 
     // ... 
    } 
}); 

Updated Example

$('.expandingNav').on('click', function (e) { 
    if ($(e.target).parent().next('ul').length) { 
     if ($(this).hasClass('expanded')) { 
      $(this).children('.hidden').slideUp(); 
      $(this).removeClass('expanded'); 
     } else { 
      $(this).children('.hidden').slideDown(); 
      $(this).addClass('expanded'); 
     } 
    } 
}); 
+0

Это работало отлично! Однако, noobie вопрос, когда это определить? Я работаю над тем, чтобы лучше познакомиться с JS и jQuery, и я сам кодировал первую часть всего этого, но потом такие вещи, как e, появляются, и я чувствую себя потерянным снова и снова. – user3888851

+0

@ user3888851 В прослушивателе событий 'click'' 'e' означает« событие ». Вы можете вызвать эту переменную, как хотите, это параметр здесь .. '$ ('. ExpandNav'). On ('click', function (e) {...});'. Если вы посмотрите на документацию по методу кликов, вы увидите, что объект называется «eventData» .. http://api.jquery.com/click/ –

+0

Документация была немного запутанной - для уточнения, e всегда является данными щелчка? Что я могу передать другим, кроме e.target? – user3888851

0

Вы shuold Избегайте распространения ничего Внутри элемента вы щелкните здесь, в этом случае его li внутри класса expandingNav.

$("li.expandingNav").on('click', function(e) { 
    if($(this).hasClass('expanded')){ 
    $(this).children('.hidden').slideUp(); 
    $(this).removeClass('expanded'); 
    } 
    else{ 
    $(this).children('.hidden').slideDown(); 
    $(this).addClass('expanded'); 
    } 
    }); 
//On sub LI click , stop propagating. 
$("li.expandingNav li").on('click', function(e) { 
e.stopPropagation(); 
}); 

Working Fiddle

0

не утруждая себя запутанными дополнительные коды.

просто положил слушателя на бирку.

так:

$('.expandingNav').children('a').click(function(){ 
    var element = $(this).parent(); 
    if($(element).hasClass('expanded')){ 
    $(element).children('.hidden').slideUp(); 
    $(element).removeClass('expanded'); 
    } 
    else{ 
    $(element).children('.hidden').slideDown(); 
    $(element).addClass('expanded'); 
    } 
}); 
1

Вы могли бы просто достичь его, добавив:

//If the e.target is the same element as this, you've not clicked on a descendant. 
if(e.target !== this) return; 

updated fiddle

+0

Это не работает. Вы удалили элемент 'a'. Https://jsfiddle.net/fdgqagt3/ –

+0

@JoshCrozier вы правы, и я думаю, что это простой способ, если пользовательский интерфейс может сделать небольшую уступку. Конечно, вы намного лучше, я также проголосовал за ваш ответ. –

Смежные вопросы