Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблема с is(":visible") (https://javascript.ru/forum/jquery/39283-problema-s-visible.html)

spo 23.06.2013 23:11

Проблема с is(":visible")
 
Не могу понять почему не срабатывает следующий код:

$("div.hctrl a").click(function() {
	if( $(this).closest("div.roll").find("div.hlist").is(':visible') ) $(this).closest("div.roll").find("div.hlist").css("visibility", "hidden");
	else $(this).closest("div.roll").find("div.hlist").css("visibility", "visible");
	return false;
});


Если поменять условие к примеру на проверку по классу, то все будет работать. Однако хочется обойтись минимальным кодом и не городить лишние addClass removeClass.

рони 23.06.2013 23:17

spo,
а как выглядит хтмл остаётся загадкой

spo 23.06.2013 23:30

Привожу весь код:

hidden();
function hidden() {$("div.hlist").css("visibility", "hidden");}
$("body").click(function() {hidden();});
	
$("div.hctrl a").click(function() {
	hidden();
	if( $(this).closest("div.roll").find("div.hlist").is(':visible') ) $(this).closest("div.roll").find("div.hlist").css("visibility", "hidden");
	else $(this).closest("div.roll").find("div.hlist").css("visibility", "visible");
	return false;
});
$("div.hlist a").click(function() {
	var new_a = $(this).attr("class"); var new_b = $(this).text();
	hidden();
	$(this).closest("div.roll").find("div.hctrl a").removeClass().addClass(new_a).text(new_b);
	$(this).closest("div.roll").find("input[type='hidden']").val(new_a);
	return false;
});


<div class="roll">
	<div class="hctrl">
		<a class="v-1" href="#" title="">1</a>
	</div>
	<div class="hlist">
		<div><a class="v-1" href="#" title="">1</a></div>
		<div><a class="v-2" href="#" title="">2</a></div>
		<div><a class="v-3" href="#" title="">3</a></div>
		<div><a class="v-4" href="#" title="">4</a></div>
	</div>
	<input type="hidden" value="v-1" />
</div>

рони 24.06.2013 00:25

spo,
Элементы с css-свойством visibility равным hidden, а так же элементы с нулевой прозрачностью, считаются видимыми, поскольку они продолжают занимать место на странице.

$(this).closest("div.roll").find("div.hlist").is(' :visible') всегда будет true

spo 24.06.2013 00:48

Вот оно что!
Тогда возникает вопрос, как правильно построить условие?

рони 24.06.2013 00:55

spo,
$(this).closest("div.roll").find("div.hlist").css('visibility')!="hidden"

spo 24.06.2013 01:26

Все получилось.
Большое спасибо, рони!

danik.js 24.06.2013 06:41

Перепиши код так:
function hideLists() {
    $("div.hlist").css("visibility", "hidden");
}
hideLists();

$("body").click(hideLists);
     
$("div.hctrl a").click(function() {
    hideLists();
    var $list = $(this).closest("div.roll").find("div.hlist");
    var visibility = $list.css("visibility");
    $list.css("visibility", visibility == "visible" ? "hidden" : "visible");
    return false;
});
$("div.hlist a").click(function() {
    var new_a = $(this).attr("class"),
        new_b = $(this).text();
    hideLists();
    $(this).closest("div.roll").find("div.hctrl a").removeClass().addClass(new_a).text(new_b);
    $(this).closest("div.roll").find("input[type='hidden']").val(new_a);
    return false;
});


Вот только почему visibility? С display был бы куда проще.

spo 24.06.2013 10:01

Спасибо, danik.js за усовершенствованный код!
Да с hide и show удобнее работать, но скрипт кастомного скроллбара, который я подключаю потом внутрь списков требует именно visibility.

Deff 24.06.2013 15:03

Цитата:

Сообщение от spo
Да с hide и show удобнее работать, но скрипт кастомного скроллбара, который я подключаю потом внутрь списков требует именно visibility.

тогда toggleClass


Часовой пояс GMT +3, время: 04:45.