JQuery обнаруживает видимые, но скрытые элементы
Кажется, что это должно быть довольно легко - но я не могу найти для него правильный селектор
В соответствии с документами (http://api.jquery.com/hidden-selector/ и http://api.jquery.com/visible-selector/)...
Элементы можно считать скрытыми по нескольким причинам:
Элемент предка скрыт, поэтому элемент не отображается на странице.
То, что я хочу обнаружить, это "этот элемент виден, но содержится в скрытом родителе". Т.е., если бы я сделал родителя видимым, этот элемент также был бы виден.
Ответы
Ответ 1
Если это то, что вы обычно будете использовать, сделайте свой собственный селектор:) Вот пример:
jQuery.expr[':'].hiddenByParent = function(a) {
return jQuery(a).is(':hidden') && jQuery(a).css('display') != 'none';
};
Вы можете использовать его так: тестовая разметка:
<div style="display: none" id="parent">
<div>
<div id="child">Test</div>
</div>
</div>
Примеры использования:
$("div:hiddenByParent").length; // "2" (plain div + child match)
$("#child").is(":hiddenByParent"); // true
В качестве альтернативы вы можете использовать функцию .filter()
следующим образом:
$('selector').filter(function() {
return $(this).is(':hidden') && $(this).css('display') != 'none';
}
Ответ 2
jQuery имеет все встроенные в настоящее время
$("#child").closest(':hidden').length == 0
Ответ 3
Если это конкретный элемент, который вы ищете, вы можете проверить его отображение свойства
$('#element').css('display') != 'none';
Если это не был конкретный элемент, вы могли бы найти родительские узлы, которые скрыты, используя: hidden, а затем используйте пользовательскую функцию для поиска узлов нужного типа.
Например.
$('parent-selector:hidden').find('node-selector').each(function(){
if($(this).css('display') != 'none') {
// do what you wanted
}
});
Если вам нужен чистый селектор, тогда я думаю, что вам не повезло, поскольку я не думаю, что вы хотите стать частью спецификации CSS, поэтому не будет в качестве селектора в jQuery.
Ответ 4
Я не думаю, что только один селектор будет работать, но
<script>
function parentHidden(id) {
return (!$(id).is(':hidden')) && $(id).parent().is(':hidden')));
}
</script>
должен вернуть то, что вам нужно. Если вам нужно проверить его предков, а не только родителя, вы можете просто заменить часть $(id).parent().is(':hidden')
на функцию, которая рекурсирует "цепочку предков".