Вопрос селектора jquery: делайте что-то, только если все элементы скрыты - PullRequest
4 голосов
/ 23 мая 2010

Мне нужно что-то делать, только если все li в данном ul скрыты ... похоже, это не сработает. есть ли способ?

if ($('#some_ul li:hidden')) {
  // do something only if all 'li's in a given ul are hidden
}

Ответы [ 4 ]

8 голосов
/ 23 мая 2010

Проверьте свойство длины возвращаемых элементов.

if ( !$('#some_ul li:visible').length ) {
  // do something only if all 'li's in a given ul are hidden
}

РЕДАКТИРОВАТЬ: изменено скрыто на видимое


РЕДАКТИРОВАТЬ: Разъяснения по использованию.length свойство для логического теста. Пожалуйста, смотрите дальнейшие объяснения внизу этого ответа.

$('#some_ul li:visible').length возвращает количество найденных элементов.Числовые значения равны true или false.

! дает вам отрицательное значение его true / false.

Так что, если $('#some_ul li:visible').length найдет 0 видимых элементов, это то же самоевозвращая false.

Когда вы помещаете ! позади него, его логическое значение меняется на true.Таким образом, если элементы visible не найдены, код в вашем if() будет запущен.

Это точно так же, как и:

if ( $('#some_ul li:visible').length == 0 ) {
  // do something only if all 'li's in a given ul are hidden
}

... который принимает числовое значениезначение $('#some_ul li:visible').length и преобразует его в логическое значение с помощью оператора ==.


Чтобы использовать :hidden, сначала необходимо получить общую длину, а затем сравнить ее со скрытой длиной.

var total = $('#some_ul li');

if ( $('#some_ul li:hidden').length == total ) {
  // do something only if all 'li's in a given ul are hidden
}

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий, для пояснения, есть несколько значений, которые будут равны true / false в тесте.

Вот несколько примеров значений, которые равны false:

var someVariable;  // someVariable is undefined, equates to false

var someVariable = '';   // someVariable is an empty string, equates to false

var someVariable = false; // someVariable is a boolean false, equates to false

var someVariable = 0;  // someVariable is number zero, equates to false

var someVariable = Number('a');  // someVariable is NaN (Not a Number), equates to false 

var someVariable = null;   // someVariable is null, equates to false

Вот несколько примеров, которые соответствуют true:

var someVariable = "false";   // someVariable is a string, equates to true

var someVariable = 123;   // someVariable is a number greater than 0, equates to true

var someVariable = -123;   // someVariable is a number less than 0, equates to true

var someVariable = true;   // someVariable is a boolean true, equates to true

var someVariable = !false;   // someVariable is a negated value that would
                             //    otherwise be false, equates to true

Если вам интересноэффективное логическое значение любого значения, поместите !! перед ним.

alert( !!123 );   // Alerts true

Первый ! преобразует значение в противоположность его действующего логического значения.Второй ! преобразует его обратно в его действующее логическое значение.

Например:

var a;  // an undefined variable

alert( a );   // alerts undefined, logically equates to 'false'

alert( !a );   // alerts the boolean opposite of undefined, which is 'true'

alert( !!a );   // alerts the converts the boolean opposite 'true' back to 'false'
1 голос
/ 23 мая 2010
$("ul:not(:has(li:visible))")

Выбирает <ul> без видимых <li> детей. Проверьте его свойство length, чтобы узнать, есть ли оно вообще, или вызовите each(), чтобы что-то сделать с каждым из них.

0 голосов
/ 23 мая 2010

Я думаю, это то, что вы хотите

if ( $('#some_ul li:hidden').length == $('#some_ul li').length ) {
  // do something only if all 'li's in a given ul are hidden
}
0 голосов
/ 23 мая 2010

Вы можете сделать как:

if ($('#some_ul li').is(':hidden')) {
  // do something only if all 'li's in a given ul are hidden
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...