Как да проверя дали даден елемент е скрит в jQuery?

Можете да превключвате видимостта на елемента с помощта на .hide() , .show() или .toggle() .

Как бихте тествали дали даден елемент е видим или скрит?

6967
07 окт. Филип Мортън попита 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 окт. е даден отговор Цветомир Цонев 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 Jan 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 :

  • Те не display стойността на CSS.
  • Това са елементи на формуляри с 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 нояб. Отговорът е даден от Педро Райнхо на 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 юли 2011 в 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 Apr 25 2012-04-25 00:04 '12 в 12:04 ч. 2012-04-25 00:04

Бих използвал CSS клас .hide { display: none!important; } .hide { display: none!important; } .

За да скриете / покажете, наричам .addClass("hide")/.removeClass("hide") . За да проверите видимостта, използвам .hasClass("hide") .

Това е прост и ясен начин за проверка / скриване / показване на елементи, ако не планирате да използвате методите .toggle() или .animate() .

145
03 февр. отговор, даден от Евгений Левин 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 в 10: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 в 3: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 02:40

Демо връзка

Източник:

Blogger Plug n Play - jQuery Инструменти и приспособления: Как да разберем дали даден елемент е скрит или видим с помощта на jQuery

105
25 янв. Отговорът е Code Spy Jan 25 2013-01-25 08:34 '13 в 8:34 2013-01-25 08: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 юни 2012 г. в 16:20 ч. 2012-06-13 16:20

При тестване на елемент с :hidden селектор в jQuery, трябва да се има предвид, че елемент с абсолютно местоположение може да бъде разпознат като скрит, въпреки че техните детски елементи са видими .

Първоначално това изглежда донякъде противоречиво - въпреки че по-задълбочен преглед на документацията jQuery предоставя съответната информация:

Елементите могат да се считат за скрити по няколко причини: [...] Тяхната ширина и височина са ясно зададени на 0. [...]

Така че наистина има смисъл по отношение на модела на кутията и изчисления стил за елемента. Дори ако ширината и височината не са изрично зададени на 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 09: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 отговорът е даден от Матиас Вегтун на 04.06.2013 г. в 4:42 2013-06-04 16:42

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

Използването на класове, предназначени за "скриване" на елементи, е просто, както и един от най-ефективните методи. Превключването на класа „скрит” с типа Display „няма” ще бъде по-бързо, отколкото директното редактиране на този стил. Обясних подробно някои от тези въпроси във въпроса за ротация на два елемента, видими / скрити в един и същ 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 апр. отговорът е даден Роман Лосев 27 април. 2015-04-27 10:57 '15 в 10:57 2015-04-27 10:57

В крайна сметка, нито един от примерите не ми подхожда, така че аз написах своя.

Тестове (без filter:alpha поддръжка на Internet Explorer filter:alpha ):

a) Проверете дали документът е скрит

б) Проверете дали елементът има нула ширина / височина / непрозрачност или display:none / visibility:hidden във вградените стилове.

в) Уверете се, че центърът (също и защото е по-бърз от тестването на всеки пиксел / ъгъл) на елемента не е скрит от друг елемент (и всички предци, например: overflow:hidden / scroll / one element over enother) или edge screen

d) Проверете дали елементът има нула width / height / opacity или display:none / visibility: скрит в изчислените стилове (сред всички предци)

изпитан

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 апр. отговорът е даден Алеко 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 AM 2014-01-31 09: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 апр. отговор, даден от Матиас Ставру 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; } 

Така че това е отговорът на въпроса за препълването на стека. Как да проверите дали даден елемент е изключен, също трябва да се обмисли.

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 aug. 2014-08-11 08:28 '14 в 8:28 2014-08-11 08: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 02:32
  • 1
  • 2

Други въпроси относно етикетите или Задайте въпрос