如何模糊div元素?

IT技术 javascript jquery html onblur
2021-02-04 02:55:52

我在 DIV 中有一个下拉菜单。

我希望当用户单击其他任何地方时隐藏下拉列表。

$('div').blur(function() { $(this).hide(); }

不管用。

我知道 .blur 仅适用于<a>但在这种情况下最简单的解决方案是什么?

6个回答

尝试在您的 div 上使用 tabindex 属性,请参阅:

查看帖子以获取更多信息和演示。

为此,需要首先关注 div。因此,在尝试单击外部 div 以查看效果之前,请确保它已聚焦
2021-03-26 02:55:52
天啊……天才!!非常感谢...在这里我试图找到一种方法来制作自定义事件处理程序... :)
2021-04-05 02:55:52

我认为问题是 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>
如果您为其指定 tabindex,div 可以接受焦点并发出 onfocus 和 onblur。试试这个:<div tabindex="100" onfocus="alert('!')"> Blah </div>
2021-03-15 02:55:52
我不认为这回答了问题。我的理解是 aamir 想要在你点击里面时隐藏 div,除非你点击 select 元素。
2021-03-17 02:55:52
虽然这有效,但要获得更全面的解决方案,特别是如果您的弹出层包含许多嵌套元素,所有这些元素都可能获得点击事件,请查看以下答案:stackoverflow.com/a/4629849/1371408
2021-03-20 02:55:52
“这是错误的。当用户点击另一个不属于菜单的 div 时会发生什么?” 是的,没错,这只是一个简单的示例,用于演示捕获主体上的事件并确定单击的实际元素。正确实施后,您需要检查目标的其他属性(很可能是 id)以确保您不会再次单击菜单。
2021-04-07 02:55:52
这是错误的。当用户点击另一个不属于菜单的 div 时会发生什么?
2021-04-10 02:55:52
$("body").click(function (evt) {
     var target = evt.target;
     if(target.id !== 'menuContainer'){
            $(".menu").hide();
    }                
});

给 div 一个 id,例如“menuContainer”。然后你可以通过 target.id 而不是 target.tagName 检查以确保它的特定 div。

不是最干净的方法,但不是捕获页面上的每个点击事件,您可以向 div 添加一个空链接,并将其用作 div 的“焦点代理”。

因此,您的标记将更改为:

<div><a id="focus_proxy" href="#"></a></div>

并且您的 Javascript 代码应该挂钩到链接上的模糊事件:

$('div > #focus_proxy').blur(function() { $('div').hide() })

显示 div 时不要忘记将焦点设置在链接上:

$('div > #focus_proxy').focus()

我刚遇到这个问题。我想以上都不能正确解决问题,所以我在这里发布我的答案。它是上述一些答案的组合:至少它解决了 2 个可能会遇到的问题,只需检查单击的点是否是相同的“id”

$("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();
    }
});