#jquery #select
#jquery #выберите
Вопрос:
эй, ребята, я создал свой собственный вид поля выбора в html с помощью css и jquery.
<div class="select">
<ul>
<li class="destination option small darr loc">One</li>
<li class="destination option small loc">Two</li>
<li class="destination option small loc">Three</li>
<li class="destination option small loc">Four</li>
</ul>
</div>
jQuery:
//select box
$('.select ul li.option').click(function(e) {
e.stopPropagation();
$(this).siblings().slideToggle(100).removeClass('darr');
$(this).addClass('darr');
});
$(document).click(function(e) {
$('.select ul li.option').each(function() {
if ( !$(this).is(":hidden") ) {
$(this).not('.darr').slideToggle(100);
}
});
});
Итак, при нажатии на первый элемент поле выбора расширяется как выпадающий список. При нажатии на один из параметров поле выбора снова сворачивается.
Я также хочу, чтобы поле выбора сворачивалось при нажатии в другом месте страницы, поэтому я прослушиваю события щелчка в $ (document). Это работает просто отлично.
Единственная небольшая ошибка, с которой я сталкиваюсь, заключается в том, что при наличии нескольких таких полей выбора на странице, и я разворачиваю одно из них и нажимаю на другое поле выбора, предыдущее не сворачивается.
Смотрите мой пример здесь: http://jsfiddle.net/UWSUk Когда вы разворачиваете второе поле выбора, а затем напрямую нажимаете на то, что выше, оно не сворачивается. Оба остаются открытыми.
Есть идеи, как это исправить?
Ответ №1:
Вы можете исправить это с помощью:
- Разрешение распространения
- Присвоение идентификаторов родительским разделам каждого ul
- Сохранение из div каждого выбранного li
- Только сворачивающиеся ЛИ, у которых нет сохраненного родительского идентификатора.
Проверка сравнения атрибутов id должна сработать, потому что идентификаторы должны быть уникальными на странице.
Вы можете увидеть, как это работает здесь.
Вот Javascript:
var currentSelectDiv = null;
$('.select ul li.option').click(function(e) {
// store the id attribute
currentSelectDiv = $(this).parents("div.select").attr("id");
$(this).siblings().slideToggle(100).removeClass('darr');
$(this).addClass('darr');
// allow bubbling because we want this event to close other classes
});
$(document).click(function(e) {
$('.select ul li.option').each(function() {
// check IDs to make sure we are only closing the other lis, not our own
if($(this).parents("div.select").attr("id") !=
currentSelectDiv) {
if ( !$(this).is(":hidden") ) {
$(this).not('.darr').slideToggle(100);
}
}
});
// clear the currently clicked parent
currentSelectDiv = null;
});
И вот HTML:
<div class="select" id="first" style="z-index:2">
<ul>
<li class="destination option small darr loc">One</li>
<li class="destination option small loc">Two</li>
<li class="destination option small loc">Three</li>
<li class="destination option small loc">Four</li>
</ul>
</div>
<div class="select" id="second">
<ul>
<li class="destination option small darr dest">Five</li>
<li class="destination option small dest">Six</li>
<li class="destination option small dest">Seven</li>
<li class="destination option small dest">Eight</li>
</ul>
</div>
Ответ №2:
Аналогично другому решению, вы могли бы назначить идентификаторы и при нажатии скрыть все выбранные элементы, которые не являются идентификатором выбранного элемента.
(не оптимизировано) http://jsfiddle.net/jbEyJ/1