我在一个元素上有一个click事件,当点击它时会在窗口上绑定另一个click事件,该事件具有一个带有反向操作的函数回调。在这种情况下,它只是一个菜单,如OS菜单,您单击菜单,然后当您单击菜单项或菜单外,它关闭菜单。想想点击右键菜单,Ubuntu / Mac就是顶级菜单栏等等。
我的问题是,因为即时绑定窗口上的点击事件,点击它也会触发窗口点击。我怎样才能“延迟”所有“未来”点击?如果您查找app().debug('closed/clicked?','console');
,您会看到两个,而且两个点击...
所以我的代码如下:
{..code...}
actionMenu: function(action,item){
if(action == 'open'){
$(window).bind('click.contextMenus',app().actionMenu('close'));
$(item).addClass('active').find('ol').css({display:'block',top:$(item).outerHeight()+'px'});
}
else if(action == 'close'){
app().debug('closed?','console');
$('#menu .active').removeClass('active');
$('#menu > ol > li ol').css({display:'none'});
$(window).unbind('click.contextMenus');
}
},
{..code...}
和
$('#menu > ol > li').click(function(e){
if($(this).find('ol').is(':visible')){
app().actionMenu('close');
}
else{
app().debug('clicked?','console');
app().actionMenu('open',this);
return false;
}
});
答案 0 :(得分:1)
而不是绑定在窗口上,你可以绑定<body>
(我不确定在窗口绑定时停止传播是否有效)
$('body').bind('click.contextMenus',app().actionMenu('close'));
然后你就可以阻止你菜单上的事件传播onclick来阻止它触发父元素'onclick
$('#menu > ol > li').click(function(e){
e.stopPropagation();
if($(this).find('ol').is(':visible')){
app().actionMenu('close');
}
else{
app().debug('clicked?','console');
app().actionMenu('open',this);
return false;
}
});
修改强>
我没有仔细观察。这就是问题:
$(window).bind('click.contextMenus',app().actionMenu('close'));
你实际上是在那里调用actionMenu()函数。你需要这样做:
$(window).bind('click.contextMenus', function() { app().actionMenu('close') } );