2010-04-10 58 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