Як перевірити, прихований елемент в jQuery?

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

Як би ви протестували, якщо елемент видно або прихований?

6967
07 окт. заданий Philip Morton 07 Жовтня. 2008-10-07 16:03 '08 о 16:03 2008-10-07 16:03
@ 56 відповідей
  • 1
  • 2

Оскільки питання відноситься до одного елементу, цей код може бути більш підходящим:

 // Checks css for display:[none|block], ignores visibility:[true|false] $(element).is(":visible"); // The same works with hidden $(element).is(":hidden"); 

Те ж саме, що і пропозиція Твента , але застосовується до одного елементу; і це відповідає алгоритму, рекомендованого в jQuery FAQ

8594
07 окт. відповідь дан Tsvetomir Tsonev 07 Жовтня. 2008-10-07 16:30 '08 о 16:30 2008-10-07 16:30

Ви можете використовувати селектор hidden :

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

І visible селектор:

 // Matches all elements that are visible $('element:visible') 
1318
07 окт. відповідь дан twernt 07 Жовтня. 2008-10-07 16:16 '08 о 16:16 2008-10-07 16:16
 if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){ // element is hidden } 

Вище метод не враховує видимість батька. Щоб розглянути і батька, ви повинні використовувати .is(":hidden") або .is(":visible") .

наприклад,

 <div id="div1" style="display:none"> <div id="div2" style="display:block">Div2</div> </div> 

Наведений вище метод буде вважати div2 видимим, а :visible немає. Але вищезазначене може бути корисно в багатьох випадках, особливо коли вам потрібно з'ясувати, чи є які-небудь помилки div, видимі в прихованому батьківському елементі, тому що в таких умовах :visible не працюватиме.

831
07 окт. відповідь дан Mote 07 Жовтня. 2008-10-07 16:09 '08 о 16:09 2008-10-07 16:09

Жоден з цих відповідей не стосується того, що я розумію, і це питання, яке я шукав: "Як обробляти елементи з visibility: hidden ?". Ні :visible , ні :hidden НЕ будуть обробляти це, так як вони обидва шукають відображення в документації. Наскільки я можу судити, немає селектора для обробки видимості CSS. Ось як я його дозволив (стандартні селектора jQuery, може бути більш стислий синтаксис):

 $(".item").each(function() { if ($(this).css("visibility") == "hidden") { // handle non visible state } else { // handle visible state } }); 
474
24 марта '11 в 21:44 2011-03-24 21:44 відповідь дан aaronLile 24 березня '11 о 21:44 2011-03-24 21:44

З Як визначити стан перемикається елемента?


Ви можете визначити, скомплектована чи елемент чи ні, за допомогою селекторів :visible і :hidden .

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

Якщо ви просто впливаєте на елемент, заснований на його видимості, ви можете просто включити :visible або :hidden в вираз-селектор. наприклад:

  $('#myDiv:visible').animate({left: '+=200px'}, 'slow'); 
343
14 янв. відповідь дан user574889 14 Січня. 2011-01-14 00:13 '11 в 0:13 2011-01-14 00: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" }); 
253
25 июля '09 в 13:21 2009-07-25 13:21 відповідь дан Simon_Weaver 25 липня '09 о 13:21 2009-07-25 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), І використовуйте інші методи для відображення і приховування елементів.

206
25 нояб. відповідь дан Pedro Rainho 25 нояб. 2011-11-25 12:16 '11 о 12:16 2011-11-25 12:16

Це працює для мене, і я використовую show() і hide() , щоб зробити мій div прихованим / видимим:

 if( $(this).css('display') == 'none' ){  } else {  } 
187
06 июля '11 в 23:19 2011-07-06 23:19 відповідь дан Abiy 06 липня '11 о 23:19 2011-07-06 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(); }); 
181
25 апр. відповідь дан webvitaly 25 квіт. 2012-04-25 00:04 '12 в 0:04 2012-04-25 00:04

Я б використовував CSS class .hide { display: none!important; } .hide { display: none!important; } .

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

Це простий і зрозумілий спосіб перевірити / приховати / показати елементи, якщо ви не плануєте використовувати методи .toggle() або .animate() .

145
03 февр. відповідь дан Evgeny Levin 03 февр. 2012-02-03 19:04 '12 о 19:04 2012-02-03 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 і вбудованих стилів

  • Не потрібно фреймворк

140
16 июля '12 в 22:18 2012-07-16 22:18 відповідь дан Matt Brock 16 липня '12 о 22:18 2012-07-16 22:18

Можна просто використовувати атрибут hidden або visible , наприклад:

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

Або ви можете спростити те ж саме за допомогою наступного.

 $(element).is(":visible") 
120
23 мая '12 в 15:59 2012-05-23 15:59 відповідь дан ScoRpion 23 травня '12 о 15:59 2012-05-23 15:59

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

110
22 апр. відповідь дан think123 22 Квітня. 2012-04-22 02:40 '12 о 2:40 2012-04-22 2:40

Демо-посилання

джерело:

Blogger Plug n Play - Питання та побажання jQuery: як дізнатися, прихований елемент або видно за допомогою jQuery

105
25 янв. відповідь дан Code Spy 25 Січня. 2013-01-25 08:34 '13 о 8:34 2013-01-25 8:34

ebdiv слід встановити на style="display:none;" , Це працює як для показу, так і для приховування:

 $(document).ready(function(){ $("#eb").click(function(){ $("#ebdiv").toggle(); }); }); 
103
13 июня '12 в 16:20 2012-06-13 16:20 відповідь дан Vaishu 13 червня '12 о 16:20 2012-06-13 16:20

При тестуванні елемента з селектором :hidden в jQuery слід враховувати, що елемент з абсолютним розташуванням може бути розпізнаний як прихований, хоча їх дочірні елементи видно.

Спочатку це здається трохи суперечить інтуїції - хоча більш пильний погляд на документацію jQuery дає відповідну інформацію:

Елементи можна вважати прихованими з кількох причин: [...] Їх ширина і висота явно встановлені на 0. [...]

Таким чином, це дійсно має сенс щодо box-model і обчисленого стилю для елемента. Навіть якщо ширина і висота не задані явно 0, вони можуть бути встановлені неявно.

Подивіться на наступний приклад:

 .foo { position: absolute; left: 10px; top: 10px; background: #ff0000; } .bar { position: absolute; left: 10px; top: 10px; width: 20px; height: 20px; background: #0000ff; } 
http://jsfiddle.net/pM2q3/7/ 

Той же JS матиме цей висновок:

 console.log($('.foo').is(':hidden')); // false console.log($('.bar').is(':hidden')); // false 
85
06 мая '14 в 13:50 2014-05-06 13:50 відповідь дан conceptdeluxe 06 травня '14 о 13:50 2014-05-06 13:50

Це може працювати:

 expect($("#message_div").css("display")).toBe("none"); 
82
20 июля '12 в 15:44 2012-07-20 15:44 відповідь дан Maneesh Kumar 20 липня '12 о 15:44 2012-07-20 15:44

приклад:

 <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> 
62
28 окт. відповідь дан Irfan DANISH 28 Жовтня. 2013-10-28 09:43 '13 в 9:43 2013-10-28 9:43

Щоб перевірити, чи не видно це, я використовую ! :

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

Або таке: sam, зберігаючи селектор jQuery в змінної, щоб мати кращу продуктивність, коли вам це потрібно кілька разів:

 var $book = $('#book') if(!$book.is(':visible')) { alert('#book is not visible') } 
61
04 июня '13 в 16:42 2013-06-04 16:42 відповідь дан Matthias Wegtun 04 червня '13 о 16:42 2013-06-04 16:42

Використовуйте перемикання класів, а не редагування стилю.,.

Використання класів, призначених для "приховування" елементів, є простим, а також одним з найбільш ефективних методів. Перемикання класу 'hidden' з типом Display 'none' буде виконуватися швидше, ніж редагування цього стилю безпосередньо. Я детально пояснив деякі з цих питань в питанні Поворот двох елементів, видимих / прихованих в одному і тому ж div .


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

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

59
19 июля '13 в 0:17 2013-07-19 00:17 відповідь дан Lopsided 19 липня '13 в 0:17 2013-07-19 00:17

Приклад використання перевірки видимої для рекламного блоку:

 <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" - це ідентифікатор, який блокує блок. Тому, перевіряючи це, якщо він видний, ви можете виявити, чи включений рекламний блок.

55
27 апр. відповідь дан Roman Losev 27 Квітня. 2015-04-27 10:57 '15 о 10:57 2015-04-27 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 
55
09 апр. відповідь дан Aleko 09 Квітня. 2014-04-09 20:06 '14 о 20:06 2014-04-09 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 автоматично перевіряє обидві речі.

50
31 янв. відповідь дан Premshankar Tiwari 31 Січня. 2014-01-31 09:24 '14 о 9:24 2014-01-31 9:24

Може бути, ви можете зробити щось на зразок цього

 <script src="https://code.jquery.com/jquery-1.10.2.js"></script> <input type="text" id="tElement" style="display:block;">Firstname</input> 
38
07 апр. відповідь дан Mathias Stavrou 07 Квітня. 2015-04-07 15:26 '15 о 15:26 2015-04-07 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; } }); 
32
19 марта '14 в 15:42 2014-03-19 15:42 відповідь дан Andron 19 березня '14 о 15:42 2014-03-19 15:42
 if($('#postcode_div').is(':visible')) { if($('#postcode_text').val()=='') { $('#spanPost').text('\u00a0'); } else { $('#spanPost').text($('#postcode_text').val()); } 
30
15 нояб. відповідь дан Gaurav 15 нояб. 2013-11-15 13:41 '13 о 13:41 2013-11-15 13:41

Але що, якщо елемент CSS виглядає наступним чином?

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

So ця відповідь на питання про переповнення стека. Як перевірити, чи є елемент поза екраном , також слід враховувати.

30
23 авг. відповідь дан RN Kushwaha 23 Серпня. 2014-08-23 23:53 '14 о 23:53 2014-08-23 23:53

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

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

Я використовував цей код для кожної функції. В іншому випадку ви можете використовувати is(':visible') для перевірки видимості елемента.

30
11 авг. відповідь дан pixellabme 11 Серпня. 2014-08-11 08:28 '14 в 8:28 2014-08-11 8:28

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

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

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

29
29 авг. відповідь дан V31 29 Серпня. 2014-08-29 23:20 '14 о 23:20 2014-08-29 23:20

Також тут є тернарного умовний вираз для перевірки стану елемента, а потім для його перемикання:

 $('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); }); 
29
06 нояб. відповідь дан cssimsek 06 нояб. 2013-11-06 02:32 '13 в 2:32 2013-11-06 2:32
  • 1
  • 2

Інші питання по мітках або Задайте питання