2010-04-10 25 views
0

我有一个奇怪的jQuery与多个事件处理程序的问题。我试图实现这一目标是:在JQuery中处理多个事件的问题

  1. 用户选择的页面
  2. 上的一些文字。如果选择不为空 - 显示上下文菜单
  3. 如果用户点击了其他地方 - 上下文菜单应消失

我有上述麻烦,有时上下文菜单显示正确,有时它会出现,并在用户选择后消失。请帮忙。请参阅下面我的代码的相关部分。另外,当用户通过双击选择一个段落或一个词时 - 出现上下文菜单并快速消失。

var ContextMenu = { 
    ... 
     show: function(e) { 
      var z = this; 
      if (!this.shown) { 
       if (this.contextMenu) { 
        this.contextMenu.css({ 
         left: e.pageX, 
         top: e.pageY 
        }).slideDown('fast'); 
        this.shown = true; 
       } 
       var hideHandler = function() { 
        z.hide(this); 
       }; 
       $(document.body).bind("click", hideHandler); 
      } 
     }, 
     hide: function(hideHandler) { 
      if (this.contextMenu && this.shown) { 
       this.contextMenu.slideUp('fast'); 
       this.shown = false; 
       $(document.body).unbind("click", hideHandler); 

      } 
     } 
}; 
    // Context menu display logic 
    $(document.body).bind("mousedown mouseup", function(e) { 
     if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) { 
      ContextMenu.show(e); 
     } 
    }); 

回答

0

看看事件绑定只mouseup帮助:

$(document.body).bind("mouseup", function(e) { 
    if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) { 
     ContextMenu.show(e); 
    } 
}); 

从我unserstand你不需要将它绑定到mousedown事件。

我想,如果你把它绑定到mousedown事件和用户通过拖动鼠标(并按下按钮)进行选择,您的上下文菜单显示(mousedown)和click处理程序绑定到文件同时按下鼠标按钮。因此,在释放鼠标按钮之后(从完成选择开始),执行a click和先前绑定的click处理程序得到执行,使得菜单再次消失。

我可能是错的。)

+0

感谢您的回答菲利克斯,可惜的是并没有解决它:(更改为“鼠标松开”之后 - 我的上下文菜单出现并立即消失的时间100%不要不知道该怎么办 – Greg 2010-04-10 12:55:26

+0

@Felix - 我试着用'setTimeout()'来绑定隐藏点击处理程序;) – 2010-04-10 13:15:50

+0

以下是Nick Craver的建议,我试着改变这一行: $(document.body)。绑定(“点击”,hideHandler); ()函数(){ $(document.body).bind(“click”,hideHandler); },2000); 它只能使用一次 - 并且上下文菜单显示正确的行为。但是,之后事情会回滚到“出现/立即消失”。 还有其他想法吗? 我有点加了一个'关闭'按钮,我的上下文菜单,它工作正常,但它不是很优雅。 – Greg 2010-04-10 13:46:28