2010-12-13 10 views
11

次のコードを使用してブロックをアニメーションしています。私のコードでは、div_animate()は、現在表示されている場合は、指定されたセレクタで<div>を本質的に隠しています。jQueryを使用して、特定の要素内でクリックイベントが発生するかどうかを判断するにはどうすればよいですか?

$(document).click(function(event){ 
    if (/* the event's target has a parent of #container */) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 
:私の知る限り、このためのコードは次のようになります - 私は、ユーザーが #containerの子をクリックしたかどうかを判断するためにそうであれば、 return false;が必要

$(document).click(function(event){ 
    div_animate("#container"); 
}); 

どのような考えですか?

+0

これは、[あなたの前の質問](http://stackoverflow.com/questionsと同じ問題です/ 4430277/jquery-animate-when-div-loses-focus)ここで私はあなたに[このリンク]を与えました(http://stackoverflow.com/questions/714471/jquery-hide-element-when-clicked-anywhere-on-ページ)? – user113716

+0

@patrickこれは私の以前の質問と同じではありませんが、関連しています。この問題は前の質問から解決策を追加したときに発生しました。 あなたのリンクは私の元の質問と似ていましたが、私はそれが有用であるとは思っていませんでした。 – Jazzerus

答えて

26

最も簡単な方法は、次のようになります。

if ($(event.target).is('#container *, #container')) // edited - thanks @gnarf 
    // is a child 
else 
    // is not a child 

あなたはそれがターゲット(または非標的)コンテナの子だかどうかを検出するために作ることができるさまざまな選択肢があります。それはちょうど1つです。代替:

if ($(event.target).closest('#container').length) 
+1

それは自分自身で '#container'を見つけられません...たぶん' $(event.target).closest( '#container')。length'または '.is( '#container、#container *') ' – gnarf

+1

これは私が欲しいものです。迅速な答えをありがとう! – Jazzerus

+1

@gnarfああそう、あなたは正しい - 私は「最も近い」選択肢をすでに追加していたが、最初のものを修正するだろう。 – Pointy

8

クリックはこのように、#container上または発祥の場合は、アクションを防ぐことができます。

$(document).click(function(event){ 
    var c = $("#container")[0]; 
    if (event.target == c || $.contains(c, event.target)) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

それは#container自体から来た場合は、最初のチェックは、第二は、それならばです子供から来た、その#container$.contains()。完全に代替、簡単な方法は、このように、#containerをクリックしたときだけdocumentまでのバブルを防ぐためです:

$("#container").click(function(e) { 
    e.stopPropagation(); 
}); 
$(document).click(function() { 
    div_animate("#container"); 
}); 
+0

ここに「#container」ルックアップをキャッシュしないようにあなたを罵倒する絶好の機会ですが、このコメントを入力し終える頃に編集したでしょう:-) – Pointy

+0

@Pointy - DOM要素としてキャッシュされました最初の投稿されたバージョンでは... –

+0

いいえ、私はちょうど冗談だったにもかかわらず、ハンドラ関数や何かの周りのクロージャでキャッシュされたという意味ではありません。 – Pointy

関連する問題