предотвратить повторение действия дважды

#jquery

#jquery

Вопрос:

я создал небольшое меню с <ul> <li> :

js:

 $('#ulAcoesCliente li').click(function(ev) {
    $(".ulNone").each(function(){
        if($(this).css("display") == "block"){
            $(this).hide('slow');
        }
    });
    $(this).find('>ul').toggle('slow');
    ev.stopPropagation();
});
  

каждый из них открывает любую область меню, закрывает и открывает там, где пользователь нажимает, как аккордеон (по одному за раз).

но если я нажму на то же самое, событие произойдет дважды.

  1. закроет текущее подменю

  2. откроется снова.

как я могу предотвратить это?

я принимаю любые советы, чтобы сделать это событие более совершенным / интеллектуальным.

Спасибо

Редактировать:

html по мере необходимости

                               <ul id="ulAcoesCliente">
                                    <li>
                                        <button style="font-size: 9px;" id="optComentario">Comentario</button>
                                        <ul class='ulNone' style="display: none;">
                                            <li>
                                                <button style="font-size: 9px; width: 150px;" id="liInserirComentario">Inserir comentario</button>
                                                <ul style="display: none;">
                                                    <li>
                                                        <div style="margin-left: 10px;padding: 5px;">
                                                            <input id="comentario" type="text" size="20"/>
                                                            <button style="font-size: 9px; width: 60px;" id="butInsereComent">Salvar</button>
                                                        </div>
                                                    </li>
                                                </ul>
                                            </li>
                                            <li style="margin-top: 3px;"><button style="font-size: 9px; width: 150px;" id="listaComent">Listar comentarios</button></li>
                                        </ul>
                                    </li>
                                    <li>
                                        <button style="font-size: 9px; margin-top: 3px;" id="OptEmail">E-mail</button>
                                        <ul class='ulNone' style="display: none;">
                                            <li style="margin-top: 5px;"><button style="font-size: 9px; width: 150px;" id="enviaEmail">Enviar E-mail</button></li>
                                            <li style="margin-top: 3px;"><button style="font-size: 9px; width: 150px;" id="listaEmails">Listar E-mails</button></li>
                                        </ul>
                                    </li>
                                    <li>
                                        <button style="font-size: 9px; margin-top: 3px;" id="">Tarefa</button>
                                        <ul class='ulNone' style="display: none;">
                                            <li style="margin-top: 5px;"><button style="font-size: 9px; width: 150px;" id="">Criar Tarefa</button></li>
                                            <li style="margin-top: 3px;"><button style="font-size: 9px; width: 150px;" id="">Listar Tarefas</button></li>
                                        </ul>
                                    </li>
                                </ul>
  

правка 2:

я достигаю этого: ( @Jayendra, сделал то же самое)

но второй уровень, закройте.

      if(!($(this).children('ul').css("display") == "block")){
        $(".ulNone").each(function(){
            if($(this).css("display") == "block"){
                $(this).stop(true,true).hide('slow');
            }
        });
        $(this).find('>ul').stop(true,true).toggle('slow');
        ev.stopPropagation();
    }
  

Комментарии:

1. Не могли бы вы, пожалуйста, добавить также HTML..

Ответ №1:

Происходит то, что то, .ulNone через что вы выполняете цикл, выберет то же самое, ul что и ваш $(this).find('>ul') селектор, заставляя его закрываться, а затем открываться снова.

Поскольку вы хотите, чтобы верхние кнопки управляли переключением, вы должны поместить событие на это, а не на li .

 $('#ulAcoesCliente > li > button').click(function(ev) {
    $(this).next().toggle('slow');
    $(this).parent("li").siblings().find(".ulNone:visible").toggle('slow');
});
  

Рабочий пример: http://jsfiddle.net/hunter/cnWjg /

Комментарии:

1. мне нужно только одно меню за раз.

2. можете ли вы сделать это, работая со вторым уровнем? проверьте, что @Jayendra опубликовал демонстрационную версию, проблема происходит там, чтобы.

3. откройте первое меню и щелкните в Inserir Comentario , оно закроется вместо открытого.

4. Я не вижу этого в Chrome. Какой браузер? Вы хотите, чтобы оно закрывало верхнюю часть при нажатии кнопки 2-го уровня?

5. да, это не одноуровневое меню, щелкните первое меню, затем нажмите Inserir Comentario , оно закроется, если вы снова откроете первое меню, будет открыто меню уровня 2.

Ответ №2:

Попробуйте — демо

 $('#ulAcoesCliente li').click(function(ev) {
    if(!$(this).find('>ul').is(':visible')){
        $(".ulNone:visible").hide('slow');
        $(this).find('>ul').toggle('slow');
        ev.stopPropagation();
    }
});
  

Комментарии:

1. работает, но проверьте свою демонстрацию, если вы нажмете на уровне 2, он закроется. я сделал это несколько минут назад. 🙂

Ответ №3:

Я мог бы предложить сделать что-то вроде этого:

 $('#ulAcoesCliente li').click(function() {
  $('#ulAcoesCliente li').slideUp();
  $(this).slideDown();
});
  

Комментарии:

1. Вы также можете заменить эту скользящую строку, чтобы сделать что-то вроде того, что у вас есть, а именно: code $(‘#ulAcoesCliente li’).each(function() { if ($(this).css(‘display’)) == «none») $(this). slideUp(); }); code

Ответ №4:

Может быть, что-то вроде этого?

 // caching
var $ulNone = $('.ulNone').filter(function () {
    return $(this).css('display') === 'block';
});

// handler
$('#ulAcoesCliente > li').click(function (e) {

    e.stopPropagation();

    var $myUl = $(this).find('> ul').show('slow');
    $ulNone.not($myUl).hide('slow');

});
  

Ключ заключается в удалении UL того, на что вы нажимаете, из набора, который вы скрываете.

Конечно, если вы согласны с этим, вы можете просто поместить toggle логику в один оператор:

 $ulNone.not(
    $(this).find('> ul').show('slow')
).hide('slow');
  

Однако это немного ухудшает читаемость.