我有一个切换菜单弹出窗口的按钮。如果您单击菜单外部但我现在的按钮切换不起作用,我可以使菜单消失。如果我再次单击该按钮,菜单会保持不变。如果切换按钮或单击容器,如何使菜单消失?
jsFiddle:http://jsfiddle.net/PPcfN/
$('.quicklinks-rollover').click(function () {
$('.quicklinks').toggle();
});
$(document).mouseup(function (e) {
var container = $(".quicklinks");
if (container.has(e.target).length === 0) {
container.hide();
}
});
答案 0 :(得分:1)
mouseup函数必须处理按钮上的单击(quicklinks-rollover)。 如果修复整个事情: http://jsfiddle.net/8VUnq/1/
$(document).mouseup(function (e) {
var popup = $('#quickLinksPopup'),
button = $('#quickLinksToggle');
if (popup.is(':visible')
&& !popup.is(e.target)
&& !button.is(e.target)
&& popup.has(e.target).length === 0
&& button.has(e.target).length === 0) {
popup.toggle();
}
});
请记住这两件事:
您可以使用以下命令确定弹出窗口的状态:$(popup).is(':visible')或is(':hidden')。
答案 1 :(得分:0)
尝试:
var $quicklinks = $('.quicklinks');
var msOverLinks = false;
$('.quicklinks-rollover').click(function () {
$quicklinks.toggle();
});
$quicklinks.mouseenter(function() {
msOverLinks = true;
}).mouseleave(function() {
msOverLinks = false;
});
$(document).mouseup(function (e) {
if( ! msOverLinks ) {
$quicklinks.toggle();
}
});
答案 2 :(得分:0)
你可以这样做普通的隐藏和显示方法。因为大多数toggle()函数都不能正常工作......
默认使用属性p =“closed”的HTML按钮:
<button class="quicklinks-rollover" p="closed" title="Quick Links">toggle</button>
改变你的Jquery:
$('.quicklinks-rollover').click(function () {
var a = $(this).attr("p");
var container = $(".quicklinks");
if(a=="closed"){
container.show();
$(this).attr("p","open");
}else{
container.hide();
$(this).attr("p","closed");
}
});
$(document).mouseup(function (e) {
var container = $(".quicklinks");
if (container.has(e.target).length === 0) {
container.hide();
}
});
答案 3 :(得分:0)
出现这种行为的原因是,当我在div上执行mouseup()
时,click()
被绑定了。您可以在console.log
事件中添加.mouseup
消息来检查此行为。
所以请尝试如下。
$('.quicklinks-rollover').on('click', function (e) {
$('.quicklinks').toggle();
e.stopImmediatePropagation();
});
$(document).click(function (e) {
var container = $(".quicklinks");
console.log(container.has(e.target).length);
if (container.has(e.target).length === 0) {
container.hide();
}
});