DIV内にドロップダウンメニューがあります。
ユーザーが他の場所をクリックしたときにドロップダウンを非表示にしたい。
$('div').blur(function() { $(this).hide(); }
動かない。
.blurはでのみ機能することを知って<a>
いますが、この場合、最も簡単な解決策は何ですか?
DIV内にドロップダウンメニューがあります。
ユーザーが他の場所をクリックしたときにドロップダウンを非表示にしたい。
$('div').blur(function() { $(this).hide(); }
動かない。
.blurはでのみ機能することを知って<a>
いますが、この場合、最も簡単な解決策は何ですか?
divでtabindex属性を使用してみてください。以下を参照してください。
詳細とデモについては、この投稿を確認してください。
問題は、divがonfocusout
イベントを発生させないことだと思います。ボディのクリックイベントをキャプチャしてから、ターゲットがメニューdivであるかどうかを確認する必要があります。そうでない場合は、ユーザーが他の場所をクリックしたため、divを非表示にする必要があります。
<head>
<script>
$(document).ready(function(){
$("body").click(function(e) {
if(e.target.id !== 'menu'){
$("#menu").hide();
}
});
});
</script>
<style>#menu { display: none; }</style>
</head>
<body>
<div id="menu_button" onclick="$('#menu').show();">Menu....</div>
<div id="menu"> <!-- Menu options here --> </div>
<p>Other stuff</p>
</body>
$("body").click(function (evt) {
var target = evt.target;
if(target.id !== 'menuContainer'){
$(".menu").hide();
}
});
divにIDを指定します(例: "menuContainer")。次に、target.tagNameの代わりにtarget.idでチェックして、その特定のdivを確認できます。
最もクリーンな方法ではありませんが、ページ上のすべてのクリックイベントをキャプチャする代わりに、divに空のリンクを追加して、divの「フォーカスプロキシ」として使用できます。
したがって、マークアップは次のように変更されます。
<div><a id="focus_proxy" href="#"></a></div>
Javascriptコードは、リンクのblurイベントにフックする必要があります。
$('div > #focus_proxy').blur(function() { $('div').hide() })
divを表示するときは、リンクにフォーカスを設定することを忘れないでください。
$('div > #focus_proxy').focus()
私はちょうどこの問題に遭遇しました。上記のどれも問題を適切に解決できないと思うので、ここに私の答えを投稿します。これは、上記の回答のいくつかを組み合わせたものです。少なくとも、クリックしたポイントが同じ「id」であるかどうかを確認するだけで遭遇する可能性のある2つの問題を修正しました。
$("body").click(function(e) {
var x = e.target;
//check if the clicked point is the trigger
if($(x).attr("class") == "floatLink"){
$(".menu").show();
}
//check if the clicked point is the children of the div you want to show
else if($(x).closest(".menu").length <= 0){
$(".menu").hide();
}
});
.clickは、divタグ内で問題なく機能します。select要素の上にいないことを確認してください。
$('div').click(function(e) {
var $target = $(e.target);
if (!$target.is("select")) { $(this).hide() };
});