Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.06.2013, 23:11
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Проблема с 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.
Ответить с цитированием
  #2 (permalink)  
Старый 23.06.2013, 23:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

spo,
а как выглядит хтмл остаётся загадкой
Ответить с цитированием
  #3 (permalink)  
Старый 23.06.2013, 23:30
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

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

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>
Ответить с цитированием
  #4 (permalink)  
Старый 24.06.2013, 00:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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

$(this).closest("div.roll").find("div.hlist").is(' :visible') всегда будет true
Ответить с цитированием
  #5 (permalink)  
Старый 24.06.2013, 00:48
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Вот оно что!
Тогда возникает вопрос, как правильно построить условие?
Ответить с цитированием
  #6 (permalink)  
Старый 24.06.2013, 00:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

spo,
$(this).closest("div.roll").find("div.hlist").css('visibility')!="hidden"
Ответить с цитированием
  #7 (permalink)  
Старый 24.06.2013, 01:26
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Все получилось.
Большое спасибо, рони!
Ответить с цитированием
  #8 (permalink)  
Старый 24.06.2013, 06:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Перепиши код так:
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 был бы куда проще.
Ответить с цитированием
  #9 (permalink)  
Старый 24.06.2013, 10:01
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Спасибо, danik.js за усовершенствованный код!
Да с hide и show удобнее работать, но скрипт кастомного скроллбара, который я подключаю потом внутрь списков требует именно visibility.
Ответить с цитированием
  #10 (permalink)  
Старый 24.06.2013, 15:03
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с обработкой ескольких .hover() anocean jQuery 3 15.06.2012 22:43
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47