jQuery を使用して、ユーザーが DIV の外側をクリックしたときに DIV を非表示にします
レビューが良さそうなので使ってみたいのですが、よくわかりません。誰か説明してくれませんか?.has()
指定された子を持つ要素を返すことは知っていますが、関数はそれをどのように処理していますか?
jQuery を使用して、ユーザーが DIV の外側をクリックしたときに DIV を非表示にします
レビューが良さそうなので使ってみたいのですが、よくわかりません。誰か説明してくれませんか?.has()
指定された子を持つ要素を返すことは知っていますが、関数はそれをどのように処理していますか?
これは、他の質問の回答のコードです。
$(document).mouseup(function (e)
{
var container = $("YOUR CONTAINER SELECTOR");
if (container.has(e.target).length === 0)
{
container.hide();
}
});
最初に知っておく必要があるのは、ブラウザーのイベントがどのように機能するかです。ほとんどの場合、それらは最初にイベントをトリガーした要素から、その祖先要素を経由してドキュメント自体まで「バブル」します。このプロセスはイベント伝播と呼ばれます。
したがって、次の HTML があるとします。
<body>
<div>
<a href="#">Click me!</a>
</div>
</body>
次に要素をクリックすると、その要素<a>
によってイベントがトリガーされますが、 、次に、そして.<a>
<div>
<body>
<document>
イベント ハンドラーを にバインドした場合document
、アンカーをクリックすると、そのイベント ハンドラー関数が引き続きトリガーされます。これは、イベントがバブル アップし、最終的にドキュメントによって処理されるためです。これは、上記のコードの基本原則です。
では、実際のイベント ハンドラ関数を見てみましょう。e
イベント自体である1 つの引数があります。そのオブジェクトには、target
最初にイベントをトリガーした要素であるプロパティがあります。
簡単な HTML の例に戻ると、<a>
要素をクリックe.target
すると、イベントがドキュメント レベルで処理されている場合でも、そのアンカーになります。this
これは、イベントを処理する要素 (この場合は ) となる jQuery イベント ハンドラー関数内とは異なりdocument
ます。
最初の行は非常に単純です。内部のクリックを無視したい要素を選択するだけです。
このif
ステートメントは少し難しいところですが、本質的には、「このイベントを最初にトリガーした要素がコンテナーの子孫でない場合は、コンテナーを非表示にする」ということです。
このcontainer.has(e.target)
部分は、「イベントをトリガーした要素はコンテナー内にありますか?」をチェックしています。その答えが「はい」の場合、length
プロパティはより大きくなります0
(正確には1
、単一の要素を含む jQuery オブジェクトで開始したためです)。
答えが「いいえ」の場合、length
プロパティは と等しくなり0
ます。これが実際に確認したいことなので、length
物件を0
私たちのif
状態と比較します。
このコードをチェックしてください:
if ($(".myClass").length === 0){
//Do stuff
}
これにより、返された jQuery オブジェクトに要素が含まれているかどうかがチェックされます。.length
要素の数を返します。したがって、長さが 0 に等しいかどうかを確認すると、オブジェクトが空かどうかに関係なくブール値が得られます。
同様に、次のようにして反対のことを行うことができます
if ($(".myClass").length > 0){
//Do stuff
}
また、0 より大きい数値は に評価されtrue
、0 は に評価されるためfalse
、次のように単純化できます。
if ($(".myClass").length){
//Contains elements
}else{
//No elements
}