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

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

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

6147
задан Philip Morton 07 окт. '08 в 16:03
источник поделиться

51 ответ

  • 1
  • 2

Поскольку вопрос относится к одному элементу, этот код может быть более подходящим:

// Checks for display:[none|block], ignores visible:[true|false]
$(element).is(":visible"); 

То же, что и предложение twernt, но применяется к одному элементу; и соответствует алгоритму, рекомендованному в FAQ jQuery

7681
ответ дан Tsvetomir Tsonev 07 окт. '08 в 16:30
источник поделиться

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

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

И visible селектор:

// Matches all elements that are visible
$('element:visible')
1146
ответ дан twernt 07 окт. '08 в 16:16
источник поделиться
if ( $(element).css('display') == 'none' ){
    // element is hidden
}

Функции не работают с атрибутом видимости.

715
ответ дан Mote 07 окт. '08 в 16:09
источник поделиться

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

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});
412
ответ дан aaronLile 24 марта '11 в 21:44
источник поделиться

Из Как определить состояние переключаемого элемента?


Вы можете определить, скомплектован ли элемент или нет, с помощью селекторов :visible и :hidden.

var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');

Если вы просто воздействуете на элемент, основанный на его видимости, вы можете просто включить :visible или :hidden в выражение-селектор. Например:

 $('#myDiv:visible').animate({left: '+=200px'}, 'slow');
295
ответ дан user574889 14 янв. '11 в 0:13
источник поделиться

Часто, проверяя, что-то видимо или нет, вы немедленно пойдете прямо вперед и сделаете что-то еще с ним. Цепочка 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" });
214
ответ дан Simon_Weaver 25 июля '09 в 13:21
источник поделиться

Селектор :visible в соответствии с документация jQuery:

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

Элементы с visibility: hidden или opacity: 0 считаются видимыми, поскольку они все еще потребляют пространство в макете.

Это полезно в некоторых случаях и бесполезно для других, потому что, если вы хотите проверить, является ли элемент видимым (display != none), игнорируя видимость родительских элементов, вы обнаружите, что выполнение .css("display") == 'none' происходит не только быстрее, но и также вернет правильность видимости.

Если вы хотите проверить видимость вместо отображения, вы должны использовать: .css("visibility") == "hidden".

Также учтите дополнительные примечания jQuery:

Поскольку :visible является расширением jQuery, а не частью спецификации CSS, запросы с использованием :visible не могут воспользоваться повышением производительности, предоставляемым встроенным методом DOM querySelectorAll(). Чтобы добиться наилучшей производительности при использовании :visible для выбора элементов, сначала выберите элементы, используя чистый селектор CSS, затем используйте .filter(":visible").

Кроме того, если вас беспокоит производительность, вы должны проверить Теперь вы видите меня... показать/скрыть производительность (2010-05-04), И используйте другие методы для отображения и скрытия элементов.

167
ответ дан Pedro Rainho 25 нояб. '11 в 12:16
источник поделиться

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

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}
156
ответ дан Abiy 06 июля '11 в 23:19
источник поделиться

Как видимость элементов и jQuery работает

Элемент может быть скрыт с помощью display:none, visibility:hidden или opacity:0. Разница между этими методами:

  • display:none скрывает элемент и не занимает какое-либо пространство;
  • visibility:hidden скрывает элемент, но он по-прежнему занимает место в макете;
  • opacity:0 скрывает элемент как "видимость: скрытый", и он по-прежнему занимает место в макете; единственная разница заключается в том, что непрозрачность позволяет сделать элемент частично прозрачным;

    if ($('.target').is(':hidden')) {
      $('.target').show();
    } else {
      $('.target').hide();
    }
    if ($('.target').is(':visible')) {
      $('.target').hide();
    } else {
      $('.target').show();
    }
    
    if ($('.target-visibility').css('visibility') == 'hidden') {
      $('.target-visibility').css({
        visibility: "visible",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        visibility: "hidden",
        display: ""
      });
    }
    
    if ($('.target-visibility').css('opacity') == "0") {
      $('.target-visibility').css({
        opacity: "1",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        opacity: "0",
        display: ""
      });
    }
    

    Полезные методы переключения jQuery:

    $('.click').click(function() {
      $('.target').toggle();
    });
    
    $('.click').click(function() {
      $('.target').slideToggle();
    });
    
    $('.click').click(function() {
      $('.target').fadeToggle();
    });
    
150
ответ дан webvitaly 25 апр. '12 в 0:04
источник поделиться

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

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

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

123
ответ дан Evgeny Levin 03 февр. '12 в 19:04
источник поделиться

Вы также можете сделать это, используя обычный JavaScript:

function isRendered(domObj) {
    if ((domObj.nodeType != 1) || (domObj == document.body)) {
        return true;
    }
    if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
        return isRendered(domObj.parentNode);
    } else if (window.getComputedStyle) {
        var cs = document.defaultView.getComputedStyle(domObj, null);
        if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
            return isRendered(domObj.parentNode);
        }
    }
    return false;
}

Примечания:

  • Работает везде

  • Работает для вложенных элементов

  • Работает для CSS и встроенных стилей

  • Не требуется фреймворк

116
ответ дан Matt Brock 16 июля '12 в 22:18
источник поделиться

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

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

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

$(element).is(":visible")
98
ответ дан ScoRpion 23 мая '12 в 15:59
источник поделиться

Еще один ответ, который вы должны учесть: если вы скрываете элемент, вы должны использовать jQuery, но вместо того, чтобы скрывать его, вы удаляете весь элемент, но вы копируете его HTML, а сам тег в переменную jQuery, а затем все, что вам нужно сделать является тестом, если на экране есть такой тег, используя обычный if (!$('#thetagname').length).

91
ответ дан think123 22 апр. '12 в 2:40
источник поделиться

ebdiv должен быть установлен на style="display:none;". Это работает для шоу и скрыть:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});
83
ответ дан Vaishu 13 июня '12 в 16:20
источник поделиться

HTML

<div id="clickme">
 Click here
</div>
<img id="book" src="http://www.chromefusion.com/wp-content/uploads/2012/06/chrome-logo.jpg" alt="" />

JQuery

<script>

$('#clickme').click(function() {
$('#book').toggle('slow', function() {
    // Animation complete.
     alert( $('#book').is(":visible"));//<--- TRUE if Visible False if Hidden
   });
});

</script>

Источник:

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

jsFiddle:

JSFiddle - ipsjolly - k4WWj

80
ответ дан jolly.exe 25 янв. '13 в 8:34
источник поделиться

При тестировании элемента с селектором :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>

ОБНОВЛЕНИЕ ДЛЯ 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
72
ответ дан conceptdeluxe 06 мая '14 в 13:50
источник поделиться

Это может работать:

expect($("#message_div").css("display")).toBe("none");
70
ответ дан Waviz Team 20 июля '12 в 15:44
источник поделиться

Чтобы проверить, не видно ли это, я использую !:

if ( !$('#book').is(':visible')) {
    alert('#book is not visible')
}

Или следующее: sam, сохраняя селектор jQuery в переменной, чтобы иметь лучшую производительность, когда вам это нужно несколько раз:

var $book = $('#book')

if(!$book.is(':visible')) {
    alert('#book is not visible')
}
51
ответ дан Matthias Wegtun 04 июня '13 в 16:42
источник поделиться

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

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


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

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

50
ответ дан Lopsided 19 июля '13 в 0:17
источник поделиться

Пример:

$(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>
48
ответ дан Irfan DANISH 28 окт. '13 в 9:43
источник поделиться

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

$(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" - это идентификатор, который блокирует блок. Поэтому, проверяя это, если он виден, вы можете обнаружить, включен ли рекламный блок.

46
ответ дан Roman Losev 27 апр. '15 в 10:57
источник поделиться

В конце концов, ни один из примеров не подходит мне, поэтому я написал свой собственный.

Тесты (без поддержки Internet Explorer filter:alpha):

a) Проверьте, не скрыт ли документ

b) Проверьте, имеет ли элемент нулевую ширину/высоту/непрозрачность или display:none/visibility:hidden в встроенных стилях

c) Убедитесь, что центр (также потому, что он быстрее, чем тестирование каждого пикселя/угла) элемента не спрятан другим элементом (и всеми предками, например: overflow:hidden/scroll/one element over enother) или экраном ребра

d) Проверьте, имеет ли элемент нулевую ширину/высоту/непрозрачность или display:none/видимость: скрытые в вычисленных стилях (среди всех предков)

Протестировано

Android 4.4 (собственный браузер /Chrome/Firefox ), Firefox (Windows/Mac), Chrome (Windows/Mac), Opera (Windows Presto/Mac Webkit), Internet Explorer (режимы Internet Explorer 5-11 + Internet Explorer 8 на виртуальной машине), Safari (Windows/Mac/iOS)

var is_visible = (function () {
    var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
        y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
        relative = !!((!x && !y) || !document.elementFromPoint(x, y));
        function inside(child, parent) {
            while(child){
                if (child === parent) return true;
                child = child.parentNode;
            }
        return false;
    };
    return function (elem) {
        if (
            document.hidden ||
            elem.offsetWidth==0 ||
            elem.offsetHeight==0 ||
            elem.style.visibility=='hidden' ||
            elem.style.display=='none' ||
            elem.style.opacity===0
        ) return false;
        var rect = elem.getBoundingClientRect();
        if (relative) {
            if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false;
        } else if (
            !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) ||
            (
                rect.top + elem.offsetHeight/2 < 0 ||
                rect.left + elem.offsetWidth/2 < 0 ||
                rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) ||
                rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth)
            )
        ) return false;
        if (window.getComputedStyle || elem.currentStyle) {
            var el = elem,
                comp = null;
            while (el) {
                if (el === document) {break;} else if(!el.parentNode) return false;
                comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false;
                el = el.parentNode;
            }
        }
        return true;
    }
})();

Как использовать:

is_visible(elem) // boolean
44
ответ дан Aleko 09 апр. '14 в 20:06
источник поделиться

Вам нужно проверить оба... Отображать, а также видимость:

if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
    // The element is not visible
} else {
    // The element is visible
}

Если мы проверим $(this).is(":visible"), jQuery автоматически проверяет обе вещи.

43
ответ дан Premshankar Tiwari 31 янв. '14 в 9:24
источник поделиться

Может быть, вы можете сделать что-то вроде этого

$(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>
30
ответ дан Mathias Stavrou 07 апр. '15 в 15:26
источник поделиться

Потому что Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout (как описано для jQuery: видимый селектор) - мы можем проверить, действительно ли элемент виден таким образом:

function isElementReallyHidden (el) {
    return $(el).is(":hidden") || $(el).css("visibility") == "hidden" || $(el).css('opacity') == 0;
}

var booElementReallyShowed = !isElementReallyHidden(someEl);
$(someEl).parents().each(function () {
    if (isElementReallyHidden(this)) {
        booElementReallyShowed = false;
    }
});
26
ответ дан Andron 19 марта '14 в 15:42
источник поделиться

Но что, если элемент CSS выглядит следующим образом?

.element{
    position: absolute;left:-9999;    
}

So этот ответ на вопрос о переполнении стека. Как проверить, является ли элемент вне экрана, также следует учитывать.

24
ответ дан RN Kushwaha 23 авг. '14 в 23:53
источник поделиться

Функция может быть создана для проверки атрибутов видимости/отображения, чтобы определить, отображается ли элемент в пользовательском интерфейсе или нет.

function checkUIElementVisible(element) {
    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}

Рабочая скрипта

23
ответ дан V31 29 авг. '14 в 23:20
источник поделиться
if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}
23
ответ дан Gaurav 15 нояб. '13 в 13:41
источник поделиться

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

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

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

22
ответ дан pixellabme 11 авг. '14 в 8:28
источник поделиться

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

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
21
ответ дан cssimsek 06 нояб. '13 в 2:32
источник поделиться
  • 1
  • 2

Другие вопросы по меткам