2016-12-19 2 views
1

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

$(function() { 
 
    $('.login-btn, .lang-btn').on('click', function(event){ 
 
     var btn = $(this); 
 
     $(document).on({ 
 
      mousedown: function(e) { 
 
       btn.children('ul').slideUp(); 
 
      }, 
 
      scroll: function() { 
 
       btn.children('ul').slideUp(); 
 
      } 
 
     }); 
 
     btn.children('ul').slideToggle(); 
 
     event.stopPropagation(); 
 

 
    }); 
 
});
ul { 
 
    list-style:none; 
 
} 
 
.btn { 
 
    margin:0 20px 0 0; 
 
    background:#ddd; 
 
    padding:5px 10px; 
 
    border-radius:4px; 
 
    cursor:pointer; 
 
    float:left; 
 
    position:relative; 
 
} 
 
.btn ul{ 
 
    position:absolute; 
 
    top:100%; 
 
    width: 290px; 
 
    padding: 20px 30px; 
 
    display: none; 
 
    height: 370px; 
 
    overflow: hidden; 
 
    background:#666; 
 
    color:#fff 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="btn login-btn"> 
 
    Sign In 
 
    <ul> 
 
     <li>Some stuff here</li> 
 
    </ul> 
 
    </li> 
 
    <li class="btn lang-btn"> 
 
    English 
 
    <ul> 
 
     <li>English</li> 
 
     <li>French</li> 
 
    </ul> 
 
    </li> 
 
</ul>

Есть ли что-то не так в моем коде ?!

+0

Можете ли вы просто проверить после выполнения приложения, сколько раз функция функции щелчка была создана, потому что две проблемы могут быть проблемой, так как в моем случае есть одна и та же проблема, я просто проверил ее и удалю ту же функцию, что и приходит дважды и использует только одно с другой страницы. –

ответ

0

Лучшее решение, чтобы сделать это, чтобы добавить окончание on и mousedown событие для остановки распространения:

$('.login-btn, .lang-btn').on('click', function(){ 
    var btn = $(this); 
    btn.children('ul').slideToggle(); 
    btn.siblings().children('ul').slideUp(); 

    $(document).on("mousedown scroll", function(e) { 
     btn.children('ul').slideUp(); 
    }); 
}).on('mousedown', function(e){ 
    e.stopPropagation(); 
}); 

Также благодаря @ DenysSéguret за его большую помощь.

3

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

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

(function(){ 
    var btn = null; 
    $('.login-btn, .lang-btn').click(function(){ 
     if (btn) return; 
     btn = $(this); 
     btn.children('ul').slideDown(); 
     return false; 
    }); 
    $(document).on("click scroll", function(){ 
     if (!btn) return; 
     btn.children('ul').slideUp(); 
     btn = null; 
     return false; 
    }); 
})(); 

Side Примечание: вы можете заметить несколько упрощений:

  • нет необходимости звоните stopPropagation и preventDefault, просто верните false
  • Не нужно повторять обработчик события при привязке, просто укажите несколько типов событий при привязке
+1

не помогло! проблема остается – Afshin

+0

Благодарим вас за редактирование, но она скользит вверх и вниз снова! – Afshin

+0

@AfshinHaghighat Кажется, ответ Denys работает хорошо! Но, может быть, вы могли бы добавить фрагмент, люди могут помочь вам легче с этим – M98

-1

ваша проблема начинается здесь:

$(document).on({ 
    mousedown: function(e) { 
     btn.children('ul').slideUp(); 
    }, 
    scroll: function() { 
     btn.children('ul').slideUp(); 
    } 
}); 
btn.children('ul').slideToggle(); 

первым вы делаете slideUp, а затем slideToggle (что делать slideUp или slideDown зависит от ситуации элемента).

поэтому, чтобы исправить вашу проблему, удалите либо часть on, либо slideToggle! проверить это обновление на вашем фрагменте кода:

 $(document).on({ 
 
      mousedown: function(e) { 
 
       btn.children('ul').slideUp(); 
 
      }, 
 
      scroll: function() { 
 
       btn.children('ul').slideUp(); 
 
      } 
 
     }); 
 
    
ul { 
 
    list-style:none; 
 
} 
 
.btn { 
 
    margin:0 20px 0 0; 
 
    background:#ddd; 
 
    padding:5px 10px; 
 
    border-radius:4px; 
 
    cursor:pointer; 
 
    float:left; 
 
    position:relative; 
 
} 
 
.btn ul{ 
 
    position:absolute; 
 
    top:100%; 
 
    width: 290px; 
 
    padding: 20px 30px; 
 
    display: none; 
 
    height: 370px; 
 
    overflow: hidden; 
 
    background:#666; 
 
    color:#fff 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="btn login-btn"> 
 
    Sign In 
 
    <ul> 
 
     <li>Some stuff here</li> 
 
    </ul> 
 
    </li> 
 
    <li class="btn lang-btn"> 
 
    English 
 
    <ul> 
 
     <li>English</li> 
 
     <li>French</li> 
 
    </ul> 
 
    </li> 
 
</ul>

+0

Использование 'slideToggle' Я хочу перемещать меню вверх и вниз.Раздвинуть меню вверх на 'mousedown' и окно' scroll' должно быть сделано. Его нельзя удалить. – Afshin

+0

'slideToggle' изменяет скольжение зависит от ситуации! так что, если это будет, он собирается спуститься, и если он упадет, он поднимется! поэтому в вашем 'on' использовать' slideToggle' и удалить 'slideUp' и использовать его впоследствии! –

+0

Вы попробовали? Кажется, если 'menu' закрыт, прокрутка откроет его. Свиток будет постоянно срабатывать, пока вы не прекратите прокрутку, которая будет постоянно переключаться. – AndFisher

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