jQueryで要素が非表示になっているかどうかを確認するにはどうすればよいですか?
-
05-07-2019 - |
質問
.hide()
、 .show()
、または .toggle()関数を使用して、要素の可視性を切り替えることができます
。
要素が表示または非表示になっているかどうかをどのようにテストしますか?
解決
質問は単一の要素を参照しているため、このコードの方が適している可能性があります。
// Checks css for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
twerntの提案と同じ、ただし単一の要素に適用されます。 jQuery FAQで推奨されているアルゴリズムと一致する
他のヒント
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
は可視ではありません。しかし、このような状況では:visible
が機能しないため、非表示の親に表示されるエラーdivがあるかどうかを確認する必要がある場合は特に、多くの場合、上記の方法が役立ちます。
これらの回答のどれも、私が質問として理解しているもの、つまり私が探していたものに対処していません。 / em>。 :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(&quot;:visible&quot;)
または filter(&quot ;:hidden&quot;)
の後に、実行するアクションでチェーンします。
そのため、 if
ステートメントの代わりに、次のようにします。
if ($('#btnUpdate').is(":visible"))
{
$('#btnUpdate').animate({ width: "toggle" }); // Hide button
}
またはより効率的ですが、さらにugい:
var button = $('#btnUpdate');
if (button.is(":visible"))
{
button.animate({ width: "toggle" }); // Hide button
}
すべてを1行で実行できます:
$('#btnUpdate').filter(":visible").animate({ width: "toggle" });
jQueryドキュメントによる:visible
セレクター:
- CSS
display
の値はnone
です。- これらは、
type =&quot; hidden&quot;
を持つフォーム要素です。- 幅と高さは明示的に0に設定されています。
- 祖先要素は非表示になっているため、要素はページに表示されません。
visibility:hidden
またはopacity:0
の要素は、レイアウト内のスペースを消費するため、可視であると見なされます。
これはいくつかの場合に有用であり、他の場合には役に立たない。なぜなら、要素が見えるかどうかを確認したい場合( display!= none
)、親の可視性を無視すると、< code> .css(&quot; display&quot;)== 'none' は高速であるだけでなく、可視性チェックを正しく返します。
表示ではなく可視性を確認する場合は、 .css(&quot; visibility&quot;)==&quot; hidden&quot;
を使用する必要があります。
追加のjQueryノートも考慮してください:
:visible
はjQuery拡張機能であり、CSS仕様の一部ではないため、:visible
を使用したクエリは、ネイティブDOMquerySelectorAll()
メソッド。:visible
を使用して要素を選択するときに最高のパフォーマンスを達成するには、まず純粋なCSSセレクターを使用して要素を選択し、次に.filter(&quot;:visible&quot;)
を使用します。
また、パフォーマンスが心配な場合は、 今、私が見えます&#8230;パフォーマンスの表示/非表示 (2010-05-04)。また、他の方法を使用して要素を表示および非表示にします。
これは私のために機能し、divを非表示/表示にするために show()
と hide()
を使用しています:
if( $(this).css('display') == 'none' ){
/* your code goes here */
} else {
/* alternate logic */
}
要素は、 display:none
、 visibility:hidden
、または opacity:0
で非表示にできます。これらの方法の違い:
-
display:none
は要素を非表示にし、スペースを取りません; -
visibility:hidden
は要素を非表示にしますが、レイアウト内のスペースを占有します; -
opacity:0
は、要素を&quot; visibility:hidden&quot;として非表示にしますが、それでもレイアウトのスペースを占有します。唯一の違いは、不透明度によって要素を部分的に透明にできることです。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クラス .hide {display:none!important;を使用します。 }
。
非表示/表示のために、 .addClass(&quot; hide&quot;)/。removeClass(&quot; hide&quot;)
を呼び出します。可視性を確認するには、 .hasClass(&quot; hide&quot;)
を使用します。
.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')
または、次のように is で同じことを簡略化できます。
$(element).is(":visible")
$('#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="" />
出典:
Bloggerプラグアンドプレイ-jQueryツールとウィジェット:jQueryを使用して要素が非表示または表示可能かどうかを確認する方法
ebdiv
は style =&quot; display:none;&quot;
に設定する必要があります。表示と非表示の両方で機能します:
$(document).ready(function(){
$("#eb").click(function(){
$("#ebdiv").toggle();
});
});
jQueryの:hidden
セレクターに対して要素をテストする場合、絶対配置された要素は、子要素が表示されているにもかかわらず非表示として認識される可能性があることを考慮する必要があります。 p>
これはそもそも直感に反するようです&#8211;ただし、jQueryのドキュメントを詳しく見ると、関連情報が得られます。
要素はいくつかの理由で隠されていると考えることができます:[...]幅と高さが明示的に0に設定されています。[...]
したがって、これは、ボックスモデルと要素の計算されたスタイルに関して実際に意味があります。幅と高さが explicitly に0に設定されていなくても、それらは implicitly に設定される場合があります。
次の例をご覧ください:
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では、説明されている動作が変わります!幅や高さがゼロのレイアウトボックスなど、レイアウトボックスがある場合、要素は表示されていると見なされます。
jQuery 3.0.0-alpha1を使用したJSFiddle:
同じJSの出力は次のとおりです。
console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false
これは動作する可能性があります:
expect($("#message_div").css("display")).toBe("none");
例:
$(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')
}
または、次もサムです。jQueryセレクターを変数に保存して、複数回必要なときにパフォーマンスを向上させます。
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
スタイルの編集ではなく、クラスの切り替えを使用します。 。 。
「非表示」に指定されたクラスを使用する要素は簡単で、最も効率的な方法の1つでもあります。 'none'の Display
スタイルで 'hidden'クラスを切り替えると、そのスタイルを直接編集するよりも速く実行されます。 Stack Overflowの質問 同じdivで2つの要素を表示/非表示にする 。
JavaScriptのベストプラクティスと最適化
こちらは、GoogleフロントエンドエンジニアのNicholas ZakasによるGoogle Tech Talkの真に啓発的なビデオです。
- Javascriptの高速化 (YouTube)
adblockerの visible チェックを使用する例がアクティブになります:
$(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>
&quot; ablockercheck&quot; adblockerがブロックするIDです。そのため、表示されているかどうかを確認すると、adblockerがオンになっているかどうかを検出できます。
結局のところ、私に合った例はないので、自分で書きました。
テスト(Internet&nbsp; Explorer filter:alpha
のサポートなし):
a)ドキュメントが非表示になっていないか確認します
b)要素の幅/高さ/不透明度がゼロであるか、インラインスタイルで display:none
/ visibility:hidden
であるかどうかを確認します
c)要素の中心(すべてのピクセル/コーナーをテストするよりも速いため)が他の要素(およびすべての祖先、例: overflow:hidden
/ scroll /他の要素の上に1つの要素)または画面の端
d)要素の幅/高さ/不透明度がゼロであるか、またはすべての祖先の中で計算されたスタイルで display:none
/ visibility:hiddenがあるかどうかを確認します
テスト済み
Android 4.4(ネイティブブラウザ/ Chrome / Firefox)、Firefox(Windows / Mac)、Chrome(Windows / Mac)、Opera(Windows Presto / Mac Webkit)、Internet&nbsp; Explorer(Internet&nbsp; Explorer 5-11ドキュメントモード+仮想マシンのInternet&nbsp; 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(&quot;:visible&quot;)
をチェックすると、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>
次のようなブール値をチェックすることで、単に可視性をチェックします。
if (this.hidden === false) {
// Your code
}
このコードを各機能に使用しました。それ以外の場合は、要素の可視性を確認するために is( ':visible')
を使用できます。
visibility:hiddenまたはopacity:0の要素は、まだレイアウト内のスペースを消費しているため、可視であると見なされます
( jQuery:visible Selector )-次の方法で要素が本当に見えるかどうかを確認できます:
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;
}
});
しかし、要素のCSSが次のような場合はどうなりますか?
.element{
position: absolute;left:-9999;
}
つまり、スタックオーバーフローの質問に対するこの回答要素が画面外にあるかどうかを確認する方法 考慮される。
また、要素の状態を確認してから切り替えるための3項条件式もあります:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
if($('#postcode_div').is(':visible')) {
if($('#postcode_text').val()=='') {
$('#spanPost').text('\u00a0');
} else {
$('#spanPost').text($('#postcode_text').val());
}
要素がUIに表示されるかどうかを判断するために、可視性/表示属性を確認するための関数を作成できます。
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}