#javascript #jquery
#javascript #jquery
Вопрос:
HTML
<a id="btn" class="btn" href="#."></a>
<div id="main-dropdown" class="hide">
<ul id="dropdown">
<li><a href="/">Back </a></li>
<li><a href="/foo">Foo </a></li>
<li><a href="/bar">Bar </a></li>
<li><a href="/baz">Baz </a></li>
<li><a href="/no">No Bar </a></li>
</ul>
</div>
Jquery
$(".btn").click(function(e) {
e.preventDefault();
$("#main-dropdown").removeClass('hide');
$("#main-dropdown").addClass('show');
return false;
});
$("#dropdown").mouseup(function() {
return false
});
$(document).mouseup(function(e) {
if($('#main-dropdown').hasClass('show')) {
$("#main-dropdown").removeClass('show');
$("#main-dropdown").addClass('hide');
return false;
}
$("#main-dropdown").removeClass("show");
$("#main-dropdown").addClass("hide");
});
Проблема:
Когда я нажимаю на href (id = btn), появляется выпадающий список, но когда я снова нажимаю на эту кнопку, она должна скрываться
чего не происходит. Где я делаю неправильно.
Ответ №1:
Изменить
$("#dropdown").mouseup(function() {
return false
});
Для
$("#dropdown a").click(function() {
return false;
});
еще несколько замечаний
- удалите
return false;
изmouseup
событий, потому что для этого события нет действия по умолчанию.. - нет необходимости вызывать оба
e.preventDefault();
иreturn false
для получения ссылок.. одного должно быть достаточно. (если вы хотите остановить пузырькование, используйте толькоreturn false
- проверьте
.toggleClass()
упрощенная версия
$(".btn").click(function(e) {
e.preventDefault();
if($('#main-dropdown').hasClass('hide')){
$("#main-dropdown").toggleClass('hide show');
}
});
$("#dropdown a").click(function() {
return false;
});
$(document).mouseup(function(e) {
if($('#main-dropdown').hasClass('show')) {
$("#main-dropdown").toggleClass('hide show');
}
});
демо http://jsfiddle.net/gaby/yjWNg/1 /
обновление для комментариев
Произошла небольшая ошибка в том, что мы должны обрабатывать событие click во всех случаях..
$(".btn").click(function(e) {
e.preventDefault();
e.stopPropagation();
$("#main-dropdown").toggleClass('show hide');
});
$("#dropdown a").click(function() {
return false;
});
$(document).click(function(e) {
if($('#main-dropdown').hasClass('show')) {
$("#main-dropdown").toggleClass('hide show');
}
});
Комментарии:
1. спасибо за предложение, но моя проблема все еще решается. В вашем примере, как только я нажимаю ссылку «Показать», она должна открыться, но если выпадающий список виден, он должен быть скрыт.
Ответ №2:
Я не уверен в том, что вы хотите сделать, но попробуйте это: http://jsbin.com/ehola3/edit
Ответ №3:
$(".btn").click(function(e) {
e.preventDefault();
if($("#main-dropdown").hasClass('hide')){
$("#main-dropdown").removeClass('hide');
$("#main-dropdown").addClass('show');
}
else{
$("#main-dropdown").removeClass('show');
$("#main-dropdown").addClass('hide');
}
return false;
});
что-то вроде этого?
Ответ №4:
Вы действительно должны использовать toggle () для отображения и скрытия содержимого.
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<button>Toggle</button>
<p style="display: none">Hello</p>
<script>
$("button").click(function () {
$("p").toggle("show");
});
</script>
</body>
</html>
Ответ №5:
Вы могли бы использовать toggleClass для переключения этого hide
класса
$(".btn").click(function(e) {
e.preventDefault();
$("#main-dropdown").toggleClass('hide');
});
Рабочий пример: ЗДЕСЬ
HTML:
<a href="#" class="btn">Show/Hide</a>
<div id="main-dropdown" class="hide">
<ul id="dropdown">
<li><a href="/">Back </a></li>
<li><a href="/foo">Foo </a></li>
<li><a href="/bar">Bar </a></li>
<li><a href="/baz">Baz </a></li>
<li><a href="/no">No Bar </a></li>
</ul>
</div>
JQUERY:
$(".btn").click(function(e) {
e.preventDefault();
$("#main-dropdown").toggleClass('hide');
});
CSS:
.hide {display: none;}