jQuery (': visible') ведет себя забавно. - PullRequest
5 голосов
/ 19 марта 2012

У меня странная проблема с проверкой видимости объекта с помощью jQuery.

У меня есть этот тест JS:

alert($myObject.css('display'));
alert($myObject.is(':visible'));

Первое предупреждение отображает «блок», который имеет смыслпоскольку firebug ясно показывает, что он установлен на display: block, и вы можете видеть объект на странице в браузере.

Второе предупреждение, однако, отображает «false».Что не имеет никакого смысла для меня вообще.

Неужели я неправильно понимаю использование is (': visible')?

Ответы [ 4 ]

9 голосов
/ 19 марта 2012

Рассмотрим этот HTML:

<div id="div1" style="display: none;">
    <div id="div2">
        <p>Some div content</p>
    </div>
</div>

и этот JavaScript:

$myObject = jQuery('#div2');
alert($myObject.css('display')); // 'block'
alert($myObject.is(':visible')); // false

Существует несколько причин, по которым $myObject может не отображаться, даже если для него установлен стиль display: none,Подробнее см. : видимые документы селектора .

Имеет ли это смысл сейчас?

4 голосов
/ 19 марта 2012

Селектор :visible не эквивалентен свойству display css.

Из связанной документации видно false, когда:

  • У них значение CSS для отображения отсутствует.
  • Это элементы формы с type = "hidden".
  • Их ширина и высота явно установлены на 0.
  • Элемент-предок скрыт, поэтому элемент не отображается на странице.
3 голосов
/ 19 марта 2012

Из документации : видимый селектор :

Элементы могут считаться скрытыми по нескольким причинам:

  • Они имеют отображаемое значение CSS:none.
  • Это элементы формы с type = "hidden".
  • Их ширина и высота явно установлены на 0.
  • Элемент-предок скрыт, поэтому элементне отображается на странице.

Убедитесь, что ни одно из этих других условий не выполняется.

1 голос
/ 20 марта 2012

Итак, ответ:

Если кто-то еще присоединяет событие CLICK к вашему объекту, о котором вы ранее не знали, это событие может испортить любую логику, которую вы пытались использовать. ;)

Увы, вот что здесь произошло. К этому объекту было прикреплено еще одно событие щелчка, для которого было установлено скрытие его родителя. Это было сначала - прежде чем моя логика проверила, видна ли она.

В конце: ошибка пользователя.

Должна быть какая-то форма репутации, если это ошибка пользователя. ;)

...