Как проверить, скрыт ли элемент в jQuery?
Можно переключить видимость элемента, используя функции .hide()
, .show()
или .toggle()
.
Как бы вы протестировали, если элемент виден или скрыт?
- 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
Вы можете использовать селектор hidden
:
// Matches all elements that are hidden
$('element:hidden')
И visible
селектор:
// Matches all elements that are visible
$('element:visible')
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
не будет работать.
Ни один из этих ответов не касается того, что я понимаю, и это вопрос, который я искал: "Как обрабатывать элементы с visibility: hidden
?". Ни :visible
, ни :hidden
не будут обрабатывать это, так как они оба ищут отображение в документации. Насколько я могу судить, нет селектора для обработки видимости CSS. Вот как я его разрешил (стандартные селектора jQuery, может быть более сжатый синтаксис):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
Из Как определить состояние переключаемого элемента?
Вы можете определить, скомплектован ли элемент или нет, с помощью селекторов :visible
и :hidden
.
var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
Если вы просто воздействуете на элемент, основанный на его видимости, вы можете просто включить :visible
или :hidden
в выражение-селектор. Например:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
Часто, проверяя, что-то видимо или нет, вы немедленно пойдете прямо вперед и сделаете что-то еще с ним. Цепочка 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" });
Селектор :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
не могут воспользоваться повышением производительности, предоставляемым встроенным методом DOMquerySelectorAll()
. Чтобы добиться наилучшей производительности при использовании:visible
для выбора элементов, сначала выберите элементы, используя чистый селектор CSS, затем используйте.filter(":visible")
.
Кроме того, если вас беспокоит производительность, вы должны проверить Теперь вы видите меня... показать/скрыть производительность (2010-05-04), И используйте другие методы для отображения и скрытия элементов.
Это работает для меня, и я использую show()
и hide()
, чтобы сделать мой div скрытым/видимым:
if( $(this).css('display') == 'none' ){
/* your code goes here */
} else {
/* alternate logic */
}
Как видимость элементов и 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(); });
Я бы использовал CSS class .hide { display: none!important; }
.
Чтобы скрыть/показать, я вызываю .addClass("hide")/.removeClass("hide")
. Для проверки видимости я использую .hasClass("hide")
.
Это простой и понятный способ проверить/скрыть/показать элементы, если вы не планируете использовать методы .toggle()
или .animate()
.
Вы также можете сделать это, используя обычный 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 и встроенных стилей
-
Не требуется фреймворк
Можно просто использовать атрибут hidden
или visible
, например:
$('element:hidden')
$('element:visible')
Или вы можете упростить то же самое с помощью следующего.
$(element).is(":visible")
Еще один ответ, который вы должны учесть: если вы скрываете элемент, вы должны использовать jQuery, но вместо того, чтобы скрывать его, вы удаляете весь элемент, но вы копируете его HTML, а сам тег в переменную jQuery, а затем все, что вам нужно сделать является тестом, если на экране есть такой тег, используя обычный if (!$('#thetagname').length)
.
$('#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="" />
Источник:
ebdiv
должно быть установлено значение style="display:none;"
, Это работает как для показа, так и для скрытия:
$(document).ready(function(){
$("#eb").click(function(){
$("#ebdiv").toggle();
});
});
При тестировании элемента с селектором :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:
Тот же 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>
Чтобы проверить, не видно ли это, я использую !
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
Или следующее: sam, сохраняя селектор jQuery в переменной, чтобы иметь лучшую производительность, когда вам это нужно несколько раз:
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
Используйте переключение классов, а не редактирование стиля.,.
Использование классов, предназначенных для "скрытия" элементов, является простым, а также одним из наиболее эффективных методов. Переключение класса 'hidden' с типом Display
'none' будет выполняться быстрее, чем редактирование этого стиля напрямую. Я подробно объяснил некоторые из этих вопросов в вопросе Поворот двух элементов, видимых/скрытых в одном и том же div.
Рекомендации и оптимизация JavaScript
Вот поистине поучительное видео в Google Tech Talk от главного инженера Google Николаса Закаса:
- Ускорьте свой Javascript (YouTube)
Пример использования проверки видимой для рекламного блока:
$(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" - это идентификатор, который блокирует блок. Поэтому, проверяя это, если он виден, вы можете обнаружить, включен ли рекламный блок.
В конце концов, ни один из примеров не подходит мне, поэтому я написал свой собственный.
Тесты (без поддержки 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
Вам нужно проверить оба... Отображать, а также видимость:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
// The element is not visible
} else {
// The element is visible
}
Если мы проверим $(this).is(":visible")
, jQuery автоматически проверяет обе вещи.
Может быть, вы можете сделать что-то вроде этого
$(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>
Потому что 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;
}
});
if($('#postcode_div').is(':visible')) {
if($('#postcode_text').val()=='') {
$('#spanPost').text('\u00a0');
} else {
$('#spanPost').text($('#postcode_text').val());
}
Но что, если элемент CSS выглядит следующим образом?
.element{
position: absolute;left:-9999;
}
So этот ответ на вопрос о переполнении стека. Как проверить, является ли элемент вне экрана, также следует учитывать.
Просто проверьте видимость, проверив логическое значение, например:
if (this.hidden === false) {
// Your code
}
Я использовал этот код для каждой функции. В противном случае вы можете использовать is(':visible')
для проверки видимости элемента.
Функция может быть создана для проверки атрибутов видимости/отображения, чтобы определить, отображается ли элемент в пользовательском интерфейсе или нет.
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}
Также здесь имеется тернарное условное выражение для проверки состояния элемента, а затем для его переключения:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
- 1
- 2
Другие вопросы по меткам javascript jquery dom visibility или Задайте вопрос