绑定点击时防止单击窗口?

时间:2011-01-31 20:10:44

标签: javascript jquery events web-applications window

我在一个元素上有一个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;
    }
  });

1 个答案:

答案 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') } );