1つのdiv(id=menu_content
)を除いて、ページの任意の場所をクリックしたときに関数をトリガーするにはどうすればよいですか?
回答:
イベントがidのdivによって生成された場合は、ドキュメントに適用click
して処理body
をキャンセルできます。これによりclick
、click
イベントがmenu_content
単一の要素にバインドされ、click
を除くすべての要素のバインドが保存されます。menu_content
$('body').click(function(evt){
if(evt.target.id == "menu_content")
return;
//For descendants of menu_content being clicked, remove this check if you do not want to put constraint on descendants.
if($(evt.target).closest('#menu_content').length)
return;
//Do processing of click event here for every element except with id menu_content
});
closest
現在の要素で始まるためmenu_content
、子孫のクリックだけでなく、のクリックも処理します。if
必要なのは2番目だけだと思います。
jQueryイベントターゲットのドキュメントを参照してください。イベントオブジェクトのtargetプロパティを使用すると、#menu_content
要素内でクリックが発生した場所を検出し、発生した場合は、クリックハンドラを早期に終了できます。.closest()
クリックがの子孫で発生した場合を処理するためにを使用する必要があります#menu_content
。
$(document).click(function(e){
// Check if click was triggered on or within #menu_content
if( $(e.target).closest("#menu_content").length > 0 ) {
return false;
}
// Otherwise
// trigger your click function
});
私はこの質問が答えられたことを知っています、そしてすべての答えは素晴らしいです。しかし、似たような(しかし完全に同じではない)問題を抱えている人々のために、この質問に2セントを追加したいと思いました。
より一般的な方法では、次のようなことができます。
$('body').click(function(evt){
if(!$(evt.target).is('#menu_content')) {
//event handling code
}
});
このようにして、idを持つ要素以外のすべてによって発生するイベントだけでなくmenu_content
、CSSセレクターを使用して選択できる要素以外のすべてによって発生するイベントも処理できます。
たとえば、次のコードスニペットでは<li>
、idを持つdiv要素の子孫であるすべての要素を除くすべての要素によってイベントが発生していますmyNavbar
。
$('body').click(function(evt){
if(!$(evt.target).is('div#myNavbar li')) {
//event handling code
}
});
これが私がしたことです。日付ピッカーの子を閉じずにクリックできることを確認したかったのです。
$('html').click(function(e){
if (e.target.id == 'menu_content' || $(e.target).parents('#menu_content').length > 0) {
// clicked menu content or children
} else {
// didnt click menu content
}
});
私の実際のコード:
$('html').click(function(e){
if (e.target.id != 'datepicker'
&& $(e.target).parents('#datepicker').length == 0
&& !$(e.target).hasClass('datepicker')
) {
$('#datepicker').remove();
}
});