javascript области видимости - Как проверить, скрыт ли элемент в jQuery?




15 Answers

Вы можете использовать hidden селектор:

// Matches all elements that are hidden
$('element:hidden')

И visible селектор:

// Matches all elements that are visible
$('element:visible')
элементы видимой окна

Можно переключить видимость элемента, используя функции .hide() , .show() или .toggle() .

Как бы вы проверили, является ли элемент видимым или скрытым?




Ни один из этих ответов не касается того, что я понимаю, это вопрос, который я искал: «Как обрабатывать элементы, которые имеют visibility: hidden , Ни :visible ни :hidden не справятся с этим, поскольку они оба ищут отображение в документации. Насколько я могу судить, нет селектора для обработки видимости CSS. Вот как я его разрешил (стандартные селектора jQuery, может быть более сжатый синтаксис):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});



Часто, проверяя, что-то видимо или нет, вы немедленно пойдете прямо вперед и сделаете что-то еще с ним. Цепочка jQuery делает это проще.

Поэтому, если у вас есть селектор, и вы хотите выполнить какое-либо действие на нем, только если он виден или скрыт, вы можете использовать filter(":visible") или filter(":hidden") а затем привязать его к действию, которое вы хотите брать.

Поэтому вместо утверждения if , например:

if ($('#btnUpdate').is(":visible"))
{
     $('#btnUpdate').animate({ width: "toggle" });   // Hide button
}

Или более эффективным, но даже более уродливым:

var button = $('#btnUpdate');
if (button.is(":visible"))
{
     button.animate({ width: "toggle" });   // Hide button
}

Вы можете сделать все это в одной строке:

$('#btnUpdate').filter(":visible").animate({ width: "toggle" });



Это работает для меня, и я использую show() и hide() чтобы сделать мой div скрытым / видимым:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}



Я бы использовал CSS-класс .hide { display: none!important; } .hide { display: none!important; } .

Для скрытия / показа вызова я вызываю .addClass("hide")/.removeClass("hide") . Для проверки видимости я использую .hasClass("hide") .

Это простой и понятный способ проверить / скрыть / показать элементы, если вы не планируете использовать .toggle() или .animate() .




Можно просто использовать hidden или visible атрибут, например:

$('element:hidden')
$('element:visible')

Или вы можете упростить то же самое, что и в следующем.

$(element).is(":visible")



$('#clickme').click(function() {
  $('#book').toggle('slow', function() {
    // Animation complete.
    alert($('#book').is(":visible")); //<--- TRUE if Visible False if Hidden
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="clickme">
  Click here
</div>
<img id="book" src="http://www.chromefusion.com/wp-content/uploads/2012/06/chrome-logo.jpg" alt="" />

Источник:

Blogger Plug n Play - Инструменты и виджеты jQuery: как увидеть скрытый или видимый элемент с помощью jQuery

jsFiddle:

JSFiddle - ipsjolly - k4WWj




При тестировании элемента против :hidden селектора в jQuery следует учитывать, что абсолютный позиционный элемент может быть распознан как скрытый, хотя их дочерние элементы видны .

В первую очередь это кажется несколько противоречащим интуиции - хотя более пристальный взгляд на документацию jQuery дает соответствующую информацию:

Элементы можно считать скрытыми по нескольким причинам: [...] Их ширина и высота явно установлены в 0. [...]

Таким образом, это действительно имеет смысл в отношении box-model и вычисленного стиля для элемента. Даже если ширина и высота не заданы явно 0, они могут быть установлены неявно .

Взгляните на следующий пример:

console.log($('.foo').is(':hidden')); // true
console.log($('.bar').is(':hidden')); // false
.foo {
  position: absolute;
  left: 10px;
  top: 10px;
  background: #ff0000;
}

.bar {
  position: absolute;
  left: 10px;
  top: 10px;
  width: 20px;
  height: 20px;
  background: #0000ff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo">
  <div class="bar"></div>
</div>

UPDATE FOR JQUERY 3.x:

С jQuery 3 описанное поведение изменится! Элементы будут считаться видимыми, если у них есть какие-либо макеты, включая нулевые ширины и / или высоты.

JSFiddle с jQuery 3.0.0-alpha1:

http://jsfiddle.net/pM2q3/7/

Тот же JS будет иметь следующий результат:

console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false



Пример:

$(document).ready(function() {
  if ($("#checkme:hidden").length) {
    console.log('Hidden');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="checkme" class="product" style="display:none">
  <span class="itemlist"><!-- Shows Results for Fish --></span> Category:Fish
  <br>Product: Salmon Atlantic
  <br>Specie: Salmo salar
  <br>Form: Steaks
</div>




Используйте переключение классов, а не редактирование стиля. , ,

Использование классов, предназначенных для «скрытия» элементов, является простым, а также одним из наиболее эффективных методов. Переключение класса 'hidden' с типом Display 'none' будет выполняться быстрее, чем редактирование этого стиля напрямую. Я объяснил некоторые из этого довольно подробно в вопросе переполнения стека. Поворот двух элементов, видимых / скрытых в одном div .

Рекомендации и оптимизация JavaScript

Вот поистине просветительский видеоролик Google Tech Talk от главного инженера Google Николаса Закаса:




Пример использования видимой проверки для рекламного блока активирован:

$(document).ready(function(){
  if(!$("#ablockercheck").is(":visible"))
    $("#ablockermsg").text("Please disable adblocker.").show();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>

«ablockercheck» - это идентификатор, который блокирует рекламный блок. Поэтому, проверяя, видно ли это, вы можете определить, включен ли рекламный блок.




Может быть, вы можете сделать что-то подобное

$(document).ready(function() {
   var visible = $('#tElement').is(':visible');

   if(visible) {
      alert("visible");
                    // Code
   }
   else
   {
      alert("hidden");
   }
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<input type="text" id="tElement" style="display:block;">Firstname</input>




if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}



Просто проверьте видимость, проверив логическое значение, например:

if (this.hidden === false) {
    // Your code
}

Я использовал этот код для каждой функции. В противном случае вы можете использовать is(':visible') для проверки видимости элемента.




Также здесь есть тернарное условное выражение для проверки состояния элемента, а затем для его переключения:

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });



Related