【问题标题】:auto-complete search suggestion drop-down popup自动完成搜索建议下拉弹出窗口
【发布时间】:2011-07-07 18:56:42
【问题描述】:

我正在尝试制作一个弹出 div(当文本框值更改时),并且可以通过单击 div 外的任何位置来关闭它(可见性:无)。 类似于 Google 建议下拉菜单。

我如何知道鼠标点击是在 div 内部还是外部发生的。

我需要使用 javascript 和 jsp 来实现它。

请帮忙。

【问题讨论】:

标签: javascript jsp html autocomplete popup


【解决方案1】:

这是一个使用 jQuery 的示例。如果单击“测试”文本,则会显示其他文本。单击新出现的文本以外的任何其他位置都会使其消失。

这是因为如果点击发生在内部(在本例中为.toggle 对象),我们调用e.stopPropagation() 来阻止点击事件进一步向上传播到整个窗口。 但是,如果点击发生在其他地方,它会直接传播到窗口并使.toggle 消失。

请参阅 example 在 jsfiddle 上的工作。

<script src="js/jquery-1.4.4.min.js"></script>
<script>
    $(function(){
        $('.test').bind('click', function(e){ 
            $('.toggle').fadeIn(); 
            e.stopPropagation();
        });
        $('.toggle').bind('click', function(e){ 
            e.stopPropagation(); 
        });
        $(document).bind('click', function(){ 
            $('.toggle').fadeOut(); 
        });
    });
</script>

<a class="test" href="#">test</a>
<div class="toggle">asdasdsa</div>

【讨论】:

  • 您不必这样做。它只是一个 javascript 框架,使您可以更轻松地将函数绑定到事件,并在 DOM 树(以及其他)中定位对象。要使此示例正常运行,您所要做的就是从他们的网站下载 jquery js 并将其包含在您的 html 中,就像我的代码的第一行一样。
【解决方案2】:

jquery 解决方案是

$("body > div").click(function() {
if ($(this).attr("id") == "div-id") {
    // inside the DIV
} else {
    // not inside the DIV
}
});

$("html").click(function (e)
{
if (e.target == document.getElementById("div-id"))
    alert("Inside DIV");
else
    alert("Outside DIV!");
});

或 Javascript sn-p 会是这样的:

<script type="text/javascript"> 
document.onclick=check; 
function check(e){ 
var target = (e && e.target) || (event && event.srcElement); 
var obj = document.getElementById('div-id'); 
if(target!=obj){obj.style.display='none'} 
} 
</script>

【讨论】:

  • 你能解释一下这行“var target = (e && e.target) || (event && event.srcElement);”
  • 函数check会在文档在任意位置被点击时被调用,并传递click事件。该行检查事件是否确实作为参数传递给函数(在大多数浏览器中),或者如果没有(其他浏览器,可能是 IE),则尝试从全局变量 event 中获取事件。
  • 编写纯javascript通常很麻烦,因为必须编写类似的不同代码才能使其在所有浏览器中正常工作。如果使用 jQuery,所有这些都在幕后处理,因此您不必担心忘记处理特定的浏览器。
【解决方案3】:

一种方法是在后面弹出一个覆盖整个屏幕(不可见)的 div,并捕获对该 div 的点击以关闭两个弹出 div。您还可以尝试捕获对 body 标记的点击,这应该会捕获 div 外部任何位置的点击(或者如果事件冒泡,也可以在 div 内部 - 您可能需要执行一些测试)。

有时更简单的方法是使用超时,例如,一旦您的鼠标离开菜单几秒钟,弹出的 CSS 菜单就会消失。您可以捕捉onmouseleave 事件,启动一个计时器,只要在两秒钟内没有另一个onmouseenter,然后隐藏弹出的div。

希望这会有所帮助!

【讨论】:

  • 一个问题。由于背景 div 覆盖了整个屏幕,因此单击弹出 div 也会导致 div 关闭。如果我错了,请纠正我。
  • @kanap008:如果点击事件没有冒泡,则不会。您可以使用 window.event.cancelBubble = true; 来阻止事件通过两个 div。见quirksmode.org/js/events_order.html
  • 这是 jQuery 的 e.stopPropagation() 在幕后所做的。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2011-12-03
  • 1970-01-01
  • 2017-08-01
  • 2021-02-05
  • 2013-07-14
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多