【发布时间】:2013-07-24 09:47:05
【问题描述】:
当用户单击弹出框外的任何位置时,我试图隐藏 Bootstrap 弹出框。 (我真的不知道为什么 Bootstrap 的创建者决定不提供这个功能。)
我找到了下面的代码on the web但是我真的不明白。
// Hide popover on click anywhere on the document except itself
$(document).click(function(e) {
// Check for click on the popup itself
$('.popover').click(function() {
return false; // Do nothing
});
// Clicking on document other than popup then hide the popup
$('.pop').popover('hide');
});
让我感到困惑的主要是$('.popover').click(function() { return false; }); 这一行。这行不是为单击事件添加事件处理程序吗?这如何防止对 popover('hide') 的调用隐藏弹出框?
有没有人见过更好的技术?
注意:我知道这个问题的变体以前在这里被问过,但这些问题的答案涉及的代码比上面的代码更复杂。所以我的问题实际上是关于上面的代码
【问题讨论】:
-
@Icarus:谢谢,但这并不能真正回答我的问题。我知道返回 false 会停止进一步处理,但是添加点击处理程序如何改变后面的行的行为?在弹出窗口关闭后,这不会阻止点击工作吗?
-
该代码完全符合您的描述。每次有人单击文档上的任何位置(包括
.popover)时,它都会添加一个完全不执行任何操作的事件侦听器。这只是浪费内存,因为同一元素上可能有许多事件侦听器,对于同一事件,它们最终会相互堆叠 -
@Dogoku:谢谢,但是为什么点击处理程序甚至在调用
popover('hide')时会发挥作用?另外,当方法返回时,新的处理程序是否会被删除? -
它应该回答你的问题,至少这一行应该:“从 在 jQuery 事件处理程序中返回 false 实际上与调用 e.preventDefault 和 e.stopPropagation 相同 ”。在您的代码示例中,弹出框单击处理程序中的
return false将停止传播到文档的单击事件处理程序,因此不会隐藏它。
标签: javascript jquery twitter-bootstrap