Можно ли переключить видимость элемента с помощью функций .hide()
, .show()
или .toggle()
?
Как бы вы проверили, является ли элемент visible
или hidden
?
Это связано, хотя и другой вопрос: stackoverflow.com/questions/17425543/…
Если вас не интересует скрытие виртуального элемента css, а физическая видимость в «области просмотра» для пользователя, то вы можете увидеть stackoverflow.com/questions/487073/… и stackoverflow.com/questions/123999/…
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>
The above method will consider
div2
visible while:visible
not. But the above might be useful in many cases, especially when you need to find if there is any error divs visible in the hidden parent because in such conditions:visible
will not work.
Это проверяет только свойство отображения одного элемента. Атрибут: visible проверяет также видимость родительских элементов.
Это единственное решение, которое у меня сработало при тестировании с IE 8.
@chiborg Да, но иногда это то, что вам нужно, и мне пришлось на собственном горьком опыте узнать, насколько «умным» был jQuery ...
Это действительно отвечает на вопрос, поскольку вопрос касается одного элемента и использования функций hide()
, show()
и toggle()
, однако, как уже было сказано большинством, мы должны использовать псевдоклассы :visible
и :hidden
.
Этот ответ можно использовать, когда элемент существует, но в данный момент отсутствует на странице, например, после detach ().
Вы можете использовать селектор hidden
:
// Matches all elements that are hidden
$('element:hidden')
// Matches all elements that are visible
$('element:visible')
просто будьте осторожны, в этой презентации есть несколько хороших советов, связанных с производительностью: addyosmani.com/jqprovenperformance
На страницах 21–28 показано, насколько медленный: hidden или: visible по сравнению с другими селекторами. Спасибо, что указали на это.
Когда вы имеете дело с парой элементов, а происходит очень мало - то есть АБСОЛЮТНО БОЛЬШОЕ БОЛЬШИНСТВО СЛУЧАЕВ - вопрос времени - это смехотворно второстепенная проблема. О нет! Прошло 42 мс вместо 19 мс !!!
Я переключаю элемент вручную, используя этот селектор. $ ('element: hidden') всегда верно для меня!
: hidden предназначен для элементов формы, а не для отображения: none. Это не тот ответ, которого люди, скорее всего, ожидают.
@cwingrav Возможно, вы захотите перечитать документацию,: hidden применяется ко всем элементам. Элементы формы с type = "hidden"
- это только один случай, который может сработать: скрытый. Элементы без высоты и ширины, элементы с display: none
и элементы со скрытыми предками также квалифицируются как: скрытые.
Встроенная презентация на связанной странице больше не работает, перейдите к slideshare.net/AddyOsmani/jquery-proven-performance-tips-tri cks.
@vbullinger 42 мс на самом деле немного дольше, чем я бы хотел дождаться, пока веб-сайт отреагирует на мои действия - это означает, что около 3 кадров анимации отбрасываются / задерживаются только при 60 кадрах в секунду.
@vbullinger - любая обработка, которая занимает более 16 мс, начинает снижать FPS. Так что да, если это занимает 42 мс, это может быть плохой сделкой, если вы заинтересованы в производительности.
Из документы jQuery: «Использование :hidden
в значительной степени может повлиять на производительность, так как это может заставить браузер повторно отобразить страницу, прежде чем он сможет определить видимость. Отслеживание видимости элементов с помощью других методов, например с использованием класса, может обеспечить лучшую производительность».
Ссылка выше на веб-сайт AddyOsmani действительна, но Slideshare больше не позволяет встраивать flash. Посмотреть слайды можно здесь slideshare.net/AddyOsmani/…
Поскольку вопрос относится к одному элементу, этот код может быть более подходящим:
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
Это то же самое, что и предложение Twernt, но применяется к одиночному элементу; а это соответствует алгоритму, рекомендованному в FAQ по jQuery.
Мы используем is () jQuery для проверки выбранного элемента с другим элементом, селектором или любым объектом jQuery. Этот метод просматривает элементы DOM, чтобы найти совпадение, которое удовлетворяет переданному параметру. Он вернет истину, если есть совпадение, в противном случае вернет ложь.
Это решение, казалось бы, поощряет смешение visible=false
и display:none
; в то время как решение Mote явно иллюстрирует намерение кодировщиков проверить display:none
; (через упоминание скрыть и показать, какой элемент управления display:none
, а не visible=true
)
Это правильно, но :visible
также проверит, видны ли родительские элементы, как указал chiborg.
Цветомир, для IE7 это не работает - даже когда элементы скрыты, он думает, что visible = true. Пожалуйста, исправьте свой ответ, чтобы не вводить людей в заблуждение. visible и display - это разные свойства, и их следует рассматривать как таковые. Ответ Моте правильный.
Вы правы - я поясню, что код проверяет только свойство display
. Учитывая, что исходный вопрос касается show()
и hide()
, и они устанавливают display
, мой ответ правильный. Кстати, с IE7 он работает, вот тестовый фрагмент - jsfiddle.net/MWZss;
Я действительно обнаружил, что слова обратной логики лучше:! $ ('Selector'). Is (': hidden'); по какой-то причине. Стоит попробовать.
Вот простой тестовый тест is () с регулярным выражением: jsperf.com/jquery-is-vs-regexp-for-css-visibility. Вывод: если вы стремитесь к производительности, используйте регулярное выражение поверх is () (поскольку is () сначала ищет все скрытые узлы, прежде чем смотреть на фактический элемент).
Чалвак, вы можете почувствовать, что что-то идет правильно, но попытайтесь объяснить, почему. Двойное отрицание сбивает с толку, в отличие от простого оператора, поэтому $ ('selector'). Is (': shown'); намного понятнее, чем! $ ('selector'). is (': hidden');
@TsvetomirTsonev, чтобы проверить видимость родителя, вы можете использовать $ (element) .parent (). Is (": visible"); Я знаю, что это немного устарело, но будет полезно для нового поиска
Что возвращает $(element).is(":visible")
, если элемент виден не с точки зрения having display:none
или visibility:hidden
, но пользователь прокрутил страницу вниз, так что на самом деле он его не видит? Есть простой способ это проверить?
Для других пользователей, которым интересно, действительно ли это работает в IE7, это может сэкономить вам время - это работает, jquery 1.9.1: imgur.com/uKD4t8h
@MaxLeske - Я почти уверен, что ДАННЫЙ! (в большинстве случаев), что когда вы вытаскиваете нож для регулярного выражения, вы получаете перфоманс. ударить. Дополнительные проверки будут нулевыми по сравнению с накладными расходами / обработкой регулярного выражения.
Как сделать наоборот?
Я нашел это информативным когда смотрел о :visible
и :hidden
. По сути, он смотрит на offsetHeight
и offsetWidth
, что позволяет ему обеспечить наилучшее покрытие (например, у вас может быть класс, который имеет display:none;
в качестве свойства, и он правильно сообщит, виден ли он)
Итак, должны ли мы использовать .is(":invisible")
для false? Или !$(element).is(":visible")
, или что?
@ Wolfpack'08: Я тоже ищу похожее решение. До сих пор я использовал $(element).css('display')=='none'
для обнаружения скрытых элементов.
@Kzqai Кроме того, я считаю, что это работает: $(selector).is('not(:hidden)')
Это не работает в последней версии jquery. Он устарел. Какая лучшая работа? (Почему они удалили это ...?)
@carl Я ничего не вижу в документации jQuery о том, что это устарело. Я также протестировал его с помощью последней версии jQuery, и он все еще работает. Здесь: jsfiddle.net/F6atJ
Не работает для элемента, у которого есть родительский overflow: hidden;
Не работает на chrome, хотя работает безупречно в firefox :( Пришлось сделать что-то вроде jQuery(textarea).parent().css('display') != 'none'
вместо jQuery(textarea).parent().is(":visible")
Изменения в 1.12+, 2.2.0+ и 3.0+ изменяют количество, если выбрано несколько элементов (см. Примечание внизу этого stackoverflow.com/a/17426800/125981)
Не работает с jQuery UI Selectmenu, в нем говорится, что моя опция скрыта, хотя она видна.
Возможно, это кому-то поможет: если вы используете анимацию, такую как toggle("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" });
Нет причин извлекать узел DOM из фрагмента, использованного в примере, а затем снова искать его. Лучше просто сделать: var $ button = $ ('# btnUpdate'); А затем в выражениях If просто используйте $ button вместо $ (button). Имеет преимущество кеширования объекта jQuery.
вот простой пример jquerypot.com/…
От Как определить состояние переключенного элемента?
Вы можете определить, свернут ли элемент или нет, используя селекторы :visible
и :hidden
.
var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
Если вы просто воздействуете на элемент на основе его видимости, вы можете просто включить :visible
или :hidden
в выражение селектора. Например:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
интересно, почему ни в одном ответе не упоминается случай, когда элемент перемещается из видимого окна, например top:-1000px
... Думаю, это крайний случай
Ни один из этих ответов не касается того, что, как я понимаю, является вопросом, который я искал, "Как обращаться с предметами, имеющими visibility: hidden
?". Ни :visible
, ни :hidden
не справятся с этим, поскольку они оба ищут дисплей в соответствии с документацией. Насколько я мог определить, нет селектора для обработки видимости CSS. Вот как я решил это (стандартные селекторы jQuery, может быть более сжатый синтаксис):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
Этот ответ хорош для буквально обработки visibility
, но вопрос был в How you would test if an element has been hidden or shown using jQuery?
. Использование jQuery означает: свойство display
.
Элементы с маркировкой visibility: hidden
или opacity: 0
считаются видимыми, поскольку они по-прежнему занимают место в макете. См. ответ от Педро Рейнхо и документация jQuery на селекторе :visible
.
вам нужно пройти вверх по DOM, чтобы проверить родителей узла, иначе это бесполезно.
Это работает для меня, и я использую show()
и hide()
, чтобы сделать мой div скрытым / видимым:
if ( $(this).css('display') == 'none' ){
/* your code goes here */
} else {
/* alternate logic */
}
Селектор :visible
согласно документация jQuery:
- They have a CSS
display
value ofnone
.- They are form elements with
type = "hidden"
.- Their width and height are explicitly set to 0.
- An ancestor element is hidden, so the element is not shown on the page.
Elements with
visibility: hidden
oropacity: 0
are considered to be visible, since they still consume space in the layout.
Это полезно в некоторых случаях и бесполезно в других, потому что, если вы хотите проверить, является ли элемент видимым (display != none
), игнорируя видимость родителей, вы обнаружите, что выполнение .css("display") == 'none'
не только быстрее, но и вернет проверку видимости правильно. .
Если вы хотите проверить видимость вместо отображения, вы должны использовать: .css("visibility") == "hidden"
.
Также примите во внимание дополнительные примечания jQuery:
Because
:visible
is a jQuery extension and not part of the CSS specification, queries using:visible
cannot take advantage of the performance boost provided by the native DOMquerySelectorAll()
method. To achieve the best performance when using:visible
to select elements, first select the elements using a pure CSS selector, then use.filter(":visible")
.
Кроме того, если вас беспокоит производительность, вам следует проверить Теперь вы видите меня ... показать / скрыть выступление (2010-05-04). И используйте другие методы для отображения и скрытия элементов.
Я бы использовал класс CSS .hide { display: none!important; }
.
Чтобы скрыть / показать, я звоню .addClass("hide")/.removeClass("hide")
. Для проверки видимости использую .hasClass("hide")
.
Это простой и понятный способ проверять / скрывать / отображать элементы, если вы не планируете использовать методы .toggle()
или .animate()
.
.hasClass('hide')
не проверяет, скрыт ли предок родителя (что также сделало бы его скрытым). Вы могли бы заставить это работать правильно, проверив, есть ли .closest('.hide').length > 0
, но зачем изобретать велосипед?
Предлагаемый вами вариант возвращается, если элемент отображается в html, мой вариант возвращается, если элемент был напрямую скрыт вашим механизмом кода / просмотра javascript. Если вы знаете, что родительские элементы никогда не должны быть скрыты - используйте .hasClass (), чтобы быть более строгим и предотвратить будущие ошибки. Если вы хотите проверить не только видимость, но и установленное состояние элемента - также используйте .hasClass (). В других случаях .closest () лучше.
Почему бы вам просто не использовать .is (": visible")?
Другой ответ, который вы должны принять во внимание: если вы скрываете элемент, вы должны использовать jQuery, но вместо того, чтобы скрывать его, вы удаляете весь элемент, но вы копируете его содержимое HTML и сам тег в переменную jQuery, а затем все, что вам нужно сделать, это проверить, есть ли такой тег на экране, используя обычный if (!$('#thetagname').length)
.
Как видимость элементов и работа 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();
});
Еще одно различие между visibility:hidden
и opacity:0
заключается в том, что элемент по-прежнему будет реагировать на события (например, щелчки) с помощью opacity:0
. Я научился этому трюку, создавая пользовательскую кнопку для загрузки файлов.
также, если вы скрываете ввод с непрозрачностью: 0, он все равно выбирается с помощью клавиши табуляции
Можно просто использовать атрибут hidden
или visible
, например:
$('element:hidden')
$('element:visible')
Или вы можете упростить то же самое с помощью является следующим образом.
$(element).is(":visible")
ebdiv
должен быть установлен на style = "display:none;"
. Он работает как для отображения, так и для скрытия:
$(document).ready(function(){
$("#eb").click(function(){
$("#ebdiv").toggle();
});
});
Вы также можете сделать это с помощью простого 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 и встроенными стилями
Не требует каркаса
Работает немного иначе, чем jQuery; он считает, что visibility: hidden
является видимый.
Достаточно легко изменить приведенный выше код, чтобы имитировать (возможно, глупое) поведение jQuery. . . . . function isRendered (o) {if ((o.nodeType! = 1) || (o == document.body)) {return true;} if (o.currentStyle && o.currentStyle ["display"]! = "none") { return isRendered (o.parentNode);} else if (window.getComputedStyle) {if (document.defaultView.getCompu tedStyle (o, null) .getPropertyValue ("display")! = "None") {return isRendered (o.parentNode);}} return false;}
Конечно, я просто добавлял это для пользы пользователей, которые использовали это без сканирования кода. :)
Это может сработать:
expect($("#message_div").css("display")).toBe("none");
Что это за язык / диалект / библиотека? Я не знаком с этим синтаксисом в JS ...
$('#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 = "https://upload.wikimedia.org/wikipedia/commons/8/87/Google_Chrome_icon_%282011%29.png" alt = "" width = "300"/>
Источник:
@Adrew, но эта ссылка показывает рабочий пример этой функции. Думаю, практический ответ может занять целую страницу текста :)
Чтобы проверить, не видно ли это, я использую !
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
Или следующее - это также sam, сохраняющий селектор jQuery в переменной, чтобы повысить производительность, когда он вам нужен несколько раз:
var $book = $('#book')
if (!$book.is(':visible')) {
alert('#book is not visible')
}
Как вы определили, что сохранение селектора в переменной действительно быстрее?
Привет @Ilia Rostovtsev jsperf.com/caching-jquery-selectors Вот и можно запустить тест. В любом случае приятно иметь его в кэше, чтобы к нему можно было получить доступ быстрее
Это подходит, если вы хотите использовать одну переменную в процессе вместо вызова и вызова одного и того же объекта.
Использовать классы, предназначенные для «сокрытия» элементов, очень просто, а также это один из самых эффективных методов. Переключение класса «скрытый» со стилем Display
на «none» будет работать быстрее, чем редактирование этого стиля напрямую. Я довольно подробно объяснил некоторые из этих вопросов в вопросе о переполнении стека Как сделать два элемента видимыми / скрытыми в одном div.
Вот поистине поучительный видеоролик Google Tech Talk, сделанный фронтенд-инженером Google Николасом Закасом:
Пример:
$(document).ready(function() {
if ($("#checkme:hidden").length) {
console.info('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>
Также вот тернарное условное выражение для проверки состояния элемента, а затем для его переключения:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
Или, y'kno, просто избавьтесь от всего условного и скажите $('elementToToggle').toggle('slow');
... :)
if ($('#postcode_div').is(':visible')) {
if ($('#postcode_text').val()=='') {
$('#spanPost').text('\u00a0');
} else {
$('#spanPost').text($('#postcode_text').val());
}
Вам нужно проверить как ... Отображение, так и видимость:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
// The element is not visible
} else {
// The element is visible
}
Если мы проверим $(this).is(":visible")
, jQuery автоматически проверит и то, и другое.
Поскольку 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;
}
});
В конце концов, ни один из примеров мне не подходит, поэтому я написал свой.
Тесты (без поддержки Internet Explorer filter:alpha
):
а) Проверьте, не скрыт ли документ
б) Проверьте, имеет ли элемент нулевую ширину / высоту / непрозрачность или display:none
/ visibility:hidden
во встроенных стилях
c) Проверьте, не скрыт ли центр (также потому, что это быстрее, чем проверка каждого пикселя / угла) элемента другим элементом (и всеми предками, например: overflow:hidden
/ scroll / один элемент над другим) или краями экрана.
d) Проверьте, имеет ли элемент нулевую ширину / высоту / непрозрачность или display:none
/ видимость: скрыто в вычисленных стилях (среди всех предков)
Проверено на
Android 4.4 (собственный браузер / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Престо / 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
.is(":not(':hidden')") /*if shown*/
Потому что: not (': hidden') не то же самое, что is (': visible'). «Visible» работает с css «opacity», а не с JQuery «show () / hide ()». Кроме того, нет дополнительной цитаты. Каждый набор играет роль в этом небольшом коде.
1) как :visible
, так и :hidden
проверяют видимость элемента CSS и предка, а не только display: none
, как вы сейчас предлагаете. 2) кавычки внутри псевдоселектора требуются, если селектор содержит только :
и буквенно-цифровые символы (например, :not(:hidden)
совпадает с not(':hidden')
(только немного быстрее) и 3) как вам станет лучше, если вы не можете согласиться с тем, что иногда на самом деле можете ошибаться? :)
При тестировании элемента по селектору :hidden
в jQuery следует учитывать, что элемент с абсолютным позиционированием может быть распознан как скрытый, хотя их дочерние элементы видны.
Во-первых, это кажется несколько нелогичным - хотя более внимательное рассмотрение документации jQuery дает соответствующую информацию:
Elements can be considered hidden for several reasons: [...] Their width and height are explicitly set to 0. [...]
Так что это действительно имеет смысл применительно к блочной модели и вычисленному стилю для элемента. Даже если ширина и высота не установлены явно в 0, они могут быть установлены неявно.
Взгляните на следующий пример:
console.info($('.foo').is(':hidden')); // true
console.info($('.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:
Затем тот же код JavaScript будет иметь следующий вывод:
console.info($('.foo').is(':hidden')); // false
console.info($('.bar').is(':hidden')); // false
Просто проверьте видимость, проверив логическое значение, например:
if (this.hidden === false) {
// Your code
}
Я использовал этот код для каждой функции. В противном случае вы можете использовать is(':visible')
для проверки видимости элемента.
Но что, если CSS этого элемента выглядит следующим образом?
.element{
position: absolute;left:-9999;
}
Так что этот ответ на вопрос о переполнении стека Как проверить, находится ли элемент за кадром также следует учитывать.
Функция может быть создана для проверки атрибутов видимости / отображения, чтобы оценить, отображается ли элемент в пользовательском интерфейсе или нет.
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}
Может ты сможешь сделать что-то вроде этого
$(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>
Пример использования проверки видимый для активированного блокировщика рекламы:
$(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 - это идентификатор, который блокирует блокировщик рекламы. Поэтому, проверяя его, если он виден, вы можете определить, включен ли блокировщик рекламы.
if ($('#id_element').is(":visible")){
alert('shown');
}else{
alert('hidden');
}
Это какой-то вариант, чтобы проверить, виден ли тег или нет
// using a pure CSS selector
if ($('p:visible')) {
alert('Paragraphs are visible (checked using a CSS selector) !');
};
// using jQuery's is() method
if ($('p').is(':visible')) {
alert('Paragraphs are visible (checked using is() method)!');
};
// using jQuery's filter() method
if ($('p').filter(':visible')) {
alert('Paragraphs are visible (checked using filter() method)!');
};
// you can use :hidden instead of :visible to reverse the logic and check if an element is hidden
// if ($('p:hidden')) {
// do something
// };
if ($("h1").is(":hidden")){
// your code..
}
Вы можете просто добавить класс, когда он будет виден. Добавьте класс show
. Затем проверьте, есть ли у него класс:
$('#elementId').hasClass('show');
Он возвращает true, если у вас есть класс show
.
Добавьте CSS следующим образом:
.show{ display: block; }
Вот как jQuery внутренне решает эту проблему:
jQuery.expr.pseudos.visible = function( elem ) {
return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};
Если вы не используете jQuery, вы можете просто использовать этот код и превратить его в свою собственную функцию:
function isVisible(elem) {
return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};
Какой isVisible
вернет true
, пока элемент виден.
Вы можете использовать это:
$(element).is(':visible');
$(document).ready(function()
{
$("#toggle").click(function()
{
$("#content").toggle();
});
$("#visiblity").click(function()
{
if ( $('#content').is(':visible') )
{
alert("visible"); // Put your code for visibility
}
else
{
alert("hidden");
}
});
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<p id = "content">This is a Content</p>
<button id = "toggle">Toggle Content Visibility</button>
<button id = "visibility">Check Visibility</button>
Я искал это, и ни один из ответов не подходит для моего случая, поэтому я создал функцию, которая вернет false, если глаза не могут увидеть элемент.
jQuery.fn.extend({
isvisible: function() {
//
// This function call this: $("div").isvisible()
// Return true if the element is visible
// Return false if the element is not visible for our eyes
//
if ( $(this).css('display') == 'none' ){
console.info("this = " + "display:none");
return false;
}
else if ( $(this).css('visibility') == 'hidden' ){
console.info("this = " + "visibility:hidden");
return false;
}
else if ( $(this).css('opacity') == '0' ){
console.info("this = " + "opacity:0");
return false;
}
else{
console.info("this = " + "Is Visible");
return true;
}
}
});
Обратите внимание: если селектор возвращает пустой набор элементов, этот метод вернет true, поэтому сначала проверьте длину, если вы ищете невидимые элементы: var items = jQuery('.selector'); if (items.length == 0 || !items.isVisible()) { alert('item is not visible'); }
А как насчет элементов, которые скрыты под другими элементами?
Как и hide()
, show()
и toggle()
прикрепляют встроенный CSS (display: none или display: block) к элементу.
Точно так же мы можем легко использовать тернарный оператор, чтобы проверить, является ли элемент скрытым или видимым, проверив отображение CSS.
Обновлено:
Таким образом, мы можем проверить свойство элемента, которое делает его невидимым. Значит они display: none
и visibility: "hidden";
Мы можем создать объект для проверки свойства, отвечающего за скрытие элемента:
var hiddenCssProps = {
display: "none",
visibility: "hidden"
}
Мы можем проверить, просматривая каждое значение ключа в сопоставлении объектов, совпадает ли свойство элемента для ключа со значением скрытого свойства.
var isHidden = false;
for(key in hiddenCssProps) {
if ($('#element').css(key) == hiddenCssProps[key]) {
isHidden = true;
}
}
Если вы хотите проверить свойство, такое как высота элемента: 0 или ширина: 0 или более, вы можете расширить этот объект и добавить к нему дополнительные свойства и проверить.
Я просто хочу уточнить, что в jQuery
Elements can be considered hidden for several reasons:
- They have a CSS display value of none.
- They are form elements with type = "hidden".
- Their width and height are explicitly set to 0.
- An ancestor element is hidden, so the element is not shown on the page.
Elements with visibility: hidden or opacity: 0 are considered to be visible, since they still consume space in the layout. During animations that hide an element, the element is considered to be visible until the end of the animation.
if ($('.element').is(':hidden')) {
// Do something
}
Есть несколько способов проверить, виден или скрыт элемент в jQuery.
Демо HTML, например ссылка
<div id = "content">Content</div>
<div id = "content2" style = "display:none">Content2</div>
Используйте селектор фильтра видимости $('element:hidden')
или $('element:visible')
$('element:hidden')
: выбирает все скрытые элементы.
Example:
$('#content2:hidden').show();
$('element:visible')
: выбирает все видимые элементы.
Example:
$('#content:visible').css('color', '#EEE');
Read more at http://api.jquery.com/category/selectors/visibility-filter-selectors/
Использовать фильтрацию is()
Example:
$('#content').is(":visible").css('color', '#EEE');
Or checking condition
if ($('#content').is(":visible")) {
// Perform action
}
Read more at http://api.jquery.com/is/
Существует слишком много методов проверки скрытых элементов. Это лучший выбор (я только что порекомендовал вам):
Using jQuery, make an element, "display:none", in CSS for hidden.
Дело в том:
$('element:visible')
И пример использования:
$('element:visible').show();
Честно говоря, вопрос предшествует ответу это.
Я добавляю это не для того, чтобы критиковать ОП, а чтобы помочь тем, кто все еще задает этот вопрос.
Правильный способ определить, является ли что-то видимым, - это обратиться к вашей модели представления;
Если вы не знаете, что это значит, вы собираетесь отправиться в путешествие открытий, которое значительно упростит вашу работу.
Вот обзор архитектуры модель-вид-вид-модель (MVVM).
KnockoutJS - это связывающая библиотека, которая позволит вам опробовать этот материал, не изучая всю структуру.
А вот код JavaScript и DIV, которые могут быть, а могут и не быть видимыми.
<html>
<body>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
<script>
var vm = {
IsDivVisible: ko.observable(true);
}
vm.toggle = function(data, event) {
// Get current visibility state for the div
var x = IsDivVisible();
// Set it to the opposite
IsDivVisible(!x);
}
ko.applyBinding(vm);
</script>
<div data-bind = "visible: IsDivVisible">Peekaboo!</div>
<button data-bind = "click: toggle">Toggle the div's visibility</button>
</body>
</html>
Обратите внимание, что функция переключения не обращается к DOM, чтобы определить видимость div; он обращается к модели представления.
$('someElement').on('click', function(){ $('elementToToggle').is(':visible')
Просто проверьте, является ли этот элемент видимый, и он вернет логический. jQuery скрывает элементы, добавляя к элементу не отображать, поэтому, если вы хотите использовать чистый JavaScript, вы все равно можете это сделать, например:
if (document.getElementById("element").style.display === 'block') {
// Your element is visible; do whatever you'd like
}
Кроме того, вы можете использовать jQuery, поскольку кажется, что остальная часть вашего кода использует его, и у вас есть меньший блок кода. Что-то вроде приведенного ниже в jQuery делает для вас тот же трюк:
if ($(element).is(":visible")) {
// Your element is visible, do whatever you'd like
};
Также использование метода css
в jQuery может привести к тому же результату:
if ($(element).css('display') === 'block') {
// Your element is visible, do whatever you'd like
}
Также в случае проверки видимости и отображения вы можете сделать следующее:
if ($(this).css("display") === "block" || $(this).css("visibility") === "visible") {
// Your element is visible, do whatever you'd like
}
Просто проверьте атрибут display
(или visibility
в зависимости от того, какой вид невидимости вы предпочитаете). Пример:
if ($('#invisible').css('display') == 'none') {
// This means the HTML element with ID 'invisible' has its 'display' attribute set to 'none'
}
Вы можете использовать класс CSS, когда он виден или скрыт, переключая класс:
.show{ display :block; }
Установите свой jQuery toggleClass()
, addClass()
или removeClass();
.
Например,
jQuery('#myID').toggleClass('show')
Приведенный выше код добавит класс css show
, если у элемента нет show
, и удалит, если он имеет класс show
.
И когда вы проверяете, виден он или нет, вы можете следовать этому коду jQuery,
jQuery('#myID').hasClass('show');
Приведенный выше код вернет логическое значение (true), если элемент #myID
имеет наш класс (show
), и false, если у него нет класса (show
).
Ты можешь сделать это:
isHidden = function(element){
return (element.style.display === "none");
};
if (isHidden($("element")) == true){
// Something
}
Вместо того, чтобы писать event
для каждого element
, сделайте следующее:
$('div').each(function(){
if ($(this).css('display') === 'none'){
$(this).css({'display':'block'});
}
});
Также вы можете использовать его на входах:
$('input').each(function(){
if ($(this).attr('type') === 'hidden'){
$(this).attr('type', 'text');
}
});
Если вы хотите проверить, отображается ли элемент на странице, в зависимости от видимости его родительского элемента, вы можете проверить, равны ли width
и height
элемента 0
.
jQuery
$element.width() === 0 && $element.height() === 0
Ваниль
element.clientWidth === 0 && element.clientHeight === 0
Или же
element.offsetWidth === 0 && element.offsetHeight === 0
Решение jQuery, но оно все же немного лучше для тех, кто хочет изменить текст кнопки:
$(function(){
$("#showHide").click(function(){
var btn = $(this);
$("#content").toggle(function () {
btn.text($(this).css("display") === 'none' ? "Show" : "Hide");
});
});
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id = "showHide">Hide</button>
<div id = "content">
<h2>Some content</h2>
<p>
What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
</p>
</div>
<script>
if ($("#myelement").is(":visible")){alert ("#myelement is visible");}
if ($("#myelement").is(":hidden")){alert ("#myelement is hidden"); }
</script>
$("#myelement div:visible").each( function() {
//Do something
});
Вот как jQuery реализует эту функцию:
jQuery.expr.filters.visible = function( elem ) {
return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};
Используя Element.getBoundingClientRect (), вы можете легко определить, находится ли ваш элемент в границах вашего окна просмотра (т.е. на экране или вне экрана):
jQuery.expr.filters.offscreen = function(el) {
var rect = el.getBoundingClientRect();
return (
(rect.x + rect.width) < 0
|| (rect.y + rect.height) < 0
|| (rect.x > window.innerWidth || rect.y > window.innerHeight)
);
};
Затем вы можете использовать это несколькими способами:
// Returns all elements that are offscreen
$(':offscreen');
// Boolean returned if element is offscreen
$('div').is(':offscreen');
Если вы используете Angular, отметьте: Не используйте скрытый атрибут с Angular
Пытаться
content.style.display != 'none'
function toggle() {
$(content).toggle();
let visible= content.style.display != 'none'
console.info('visible:', visible);
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button onclick = "toggle()">Show/hide</button>
<div id = "content">ABC</div>
Вы можете использовать функцию jQuery is()
, чтобы проверить видимый или скрытый выбранный элемент. Этот метод просматривает элементы DOM, чтобы найти совпадение, которое удовлетворяет переданному параметру. Он вернет истину, если есть совпадение, в противном случае вернет ложь.
<script>
($("#myelement").is(":visible"))? alert("#myelement is visible") : alert("#myelement is hidden");
</script>
Приведенный ниже код проверяет, является ли элемент скрытым в jQuery или видимым.
// You can also do this...
$("button").click(function(){
// show hide paragraph on button click
$("p").toggle("slow", function(){
// check paragraph once toggle effect is completed
if ($("p").is(":visible")){
alert("The paragraph is visible.");
} else{
alert("The paragraph is hidden.");
}
});
});
Он возвращает false
, если элемент не виден.
function checkVisible(e) {
if (!(e instanceof Element)) throw Error('not an Element');
const elementStyle = getComputedStyle(e);
if (elementStyle.display === 'none' || elementStyle.visibility !== 'visible' || elementStyle.opacity < 0.1) return false;
if (e.offsetWidth + e.offsetHeight + e.getBoundingClientRect().height +
e.getBoundingClientRect().width === 0) {
return false;
}
const elemCenter = {
x: e.getBoundingClientRect().left + e.offsetWidth / 2,
y: e.getBoundingClientRect().top + e.offsetHeight / 2
};
if (elemCenter.x < 0 || elemCenter.y < 0) return false;
if (elemCenter.x > (document.documentElement.clientWidth || window.innerWidth)) return false;
if (elemCenter.y > (document.documentElement.clientHeight || window.innerHeight)) return false;
let pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);
do {
if (pointContainer === e) return true;
} while (pointContainer = pointContainer.parentNode);
return false;
}
Вы также можете:
hideShow(){
$("#accordionZiarat").hide();
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
if ($("#accordionZiarat").is(":visible")) {
$("#accordionZiarat").hide();
}
else if ($("#accordionZiarat").is(":hidden")) {
$("#accordionZiarat").show();
}
else{
}
Используя скрытый выбор, вы можете сопоставить все скрытые элементы
$('element:hidden')
Используя видимый выбор, вы можете сопоставить все видимые элементы
$('element:visible')
if ($(element).is(":visible")) {
console.info('element is visible');
} else {
console.info('element is not visible');
}
Стоит упомянуть (даже спустя столько времени), что
$(element).is(":visible")
работает для jQuery 1.4.4, но не для jQuery 1.3.2 под Internet & nbsp; Explorer & nbsp; 8. Это можно проверить с помощью Полезный тестовый отрывок Цветомира Цонева. Просто не забудьте изменить версию jQuery, чтобы протестировать каждую из них.