当在jQuery中使用不同的点击侦听器时,如何忽略一个模糊侦听器?

How can I ignore one blur listener when a different click listener is used in jQuery?

提问人:Andrew G. Johnson 提问时间:12/9/2010 最后编辑:Andrew G. Johnson 更新时间:12/10/2010 访问量:1012

问:

所以这很难用一句话来表达,但这里有一个简单的例子:

<html>
    <head>
        <title>Example</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript">
        <!--
            $(document).ready(function() {
                $("#input").focus(function() {
                    $("#p").show();
                }).blur(function() {
                    $("#p").hide();
                });
                $("#p").click(function() {
                    alert("Thanks for clicking me");
                });
            });
        -->
        </script>

    </head>
    <body>
        <input type="text" id="input" />
        <p id="p" style="background:red;display:none"">
            Click me.
        </p>
    </body>
</html>

基本上,当您专注于输入时,会出现一个段落,而当焦点模糊时,段落会消失。但是,段落上还有一个单击侦听器,因此当您单击它时,会出现一个警告消息框。问题是当我聚焦输入框时,段落出现[预期],但是当我单击该段落时,首先注册了输入框的模糊,因此该段落在浏览器检测到我单击它之前就被隐藏了。

JavaScript jQuery 事件处理

评论


答:

2赞 PetersenDidIt 12/9/2010 #1

试试 Ben Alman 的 jQuery Outside 事件插件

那么你的代码将是:

$(document).ready(function() {
    $("#input").focus(function() {
        $("#p").show();
    }).bind('focusoutside', function(event) {
        if (!$(event.target).is('#p')) {
            $("#p").hide();
        }
    });
    $("#p").click(function() {
        alert("Thanks for clicking me");
        // Do this if you need to hide #p after doing 
        // whatever click on p really does.
        $(this).hide(); 
    });
});

通过使用 focusoutside 事件,它将捕获单击和 Tab 键,并让您根据焦点的位置来决定想要执行的操作。#input

示例:http://jsfiddle.net/petersendidit/WSEWh/2/

评论

0赞 mikesir87 12/9/2010
那么你不需要点击函数中的$(“#p”).hide()吗?
0赞 PetersenDidIt 12/9/2010
@mikesir87 取决于他被点击时想做什么。但很可能是的。#p
0赞 mikesir87 12/9/2010
听起来很棒!我不知道如何使用事件对象,所以这非常有用。谢谢!