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
}