mousedown
その外側に非表示にしたいオーバーレイがあります。
これが私が試したものですが、残念ながら:not
セレクターは期待どおりに機能していません。
$('body:not(.overlay)').one('mousedown',function(){
//hide overlay here
});
私も試し$('* :not(.overlay)')
ましたが、同じ問題です。
オーバーレイ ボックス内をクリックしてもオーバーレイが非表示になる
mousedown
その外側に非表示にしたいオーバーレイがあります。
これが私が試したものですが、残念ながら:not
セレクターは期待どおりに機能していません。
$('body:not(.overlay)').one('mousedown',function(){
//hide overlay here
});
私も試し$('* :not(.overlay)')
ましたが、同じ問題です。
オーバーレイ ボックス内をクリックしてもオーバーレイが非表示になる
$(document).on( "mousedown.hideoverlay", function(e){
if( $(e.target).closest(".overlay").length === 0 ) { //overlay wasn't clicked.
//hide overlay
$(document).off("mousedown.hideoverlay");
}
});
body:not(.overlay)
class がない場合、セレクターは body 要素と一致overlay
します。あなたが意味したのは、 class のない子孫であると想定していますoverlay
。
$('body :not(.overlay)'); //note the space - descendant selector
このような割り当ての問題は、一致する要素が多すぎることです (特に、選択された要素の親)。技術的には、任意のコンテナーをクリックしても、セレクターfiddleddiv
と一致します。これは、class を持つ要素をクリックしてもDOM に伝播し続けるために発生します。overlay
ここでの他の提案に同意します。つまり、すべてのクリックをリッスンし、セレクターが一致しない場合は何もしないのが適切ですが、それらのイベントの伝播を防止すると、ページのロジックの残りの部分に干渉する可能性があります。
クリックできる「オーバーレイ可能な」アイテムの明示的なサブセットがあり、それらを:not(.overlay)
セレクターでフィルタリングするアプローチを推奨します。
$('.some-generic-container-name:not(.overlay)')...
.not() 関数を試してください: http://api.jquery.com/not/。選択したグループから要素を明確に削除しますが、これはおそらくここで発生している問題です。これを解決するために複雑な if などを行う必要がなくなります
$('*').not('.overlay').on('mousedown', function(){
alert("here");
});
へー、質問を完全に読んでいませんでした:
$(document).on('mousedown', function(e){
var target = $(e.target);
if(!target.parents().hasClass('overlay') && !target.hasClass('overlay')){
// hide stuff
}
});
編集:ここをクリックすることを好みます(理由はわかりません):
$(document).on('click', function(e){
var target = $(e.target);
if(!target.parents().hasClass('overlay') && !target.hasClass('overlay')){
// hide stuff
}
});
私の意見では、それはただ見栄えがするだけです。