2010-04-29 51 views
8

我想在用戶右鍵單擊輸入字段時禁用默認的contextMenu,以便顯示自定義的contextMenu。一般來說,它很容易通過做類似禁用右鍵菜單:jQuery:preventDefault()不適用於輸入/點擊事件?

$([whatever]).bind("click", function(e) { e.preventDefault(); }); 

而事實上,我可以做到這一點上幾乎所有的元素,除了在FF輸入字段 - 任何人都知道爲什麼或可能指向我的某些文檔?

下面是我正在使用的相關代碼,謝謝你們。

HTML:

<script type="text/javascript"> 
var r = new RightClickTool(); 
</script> 

<div id="main"> 
    <input type="text" class="listen rightClick" value="0" /> 
</div> 

JS:

function RightClickTool(){ 

var _this = this; 
var _items = ".rightClick"; 

$(document).ready(function() { _this.init(); }); 

this.init = function() { 
_this.setListeners(); 
} 

this.setListeners = function() { 
$(_items).click(function(e) { 
    var webKit = !$.browser.msie && e.button == 0; 
    var ie = $.browser.msie && e.button == 1; 

    if(webKit||ie) 
    { 

    // Left mouse...do something() 

    } else if(e.button == 2) { 
    e.preventDefault(); 

    // Right mouse...do something else(); 
    } 

}); 
} 

} // Ends Class 

編輯:

對不起,我讀明白,我要澄清一些事情的意見後。

1)在某種意義上,上面的代碼確實有效。代碼能夠通過點擊哪個按鈕進行排序,它只是不在意我說e.preventDefault()並且右鍵單擊菜單仍然彈出。換句話說,如果你在e.button上放置一個警報,你會得到你的1或0左邊和2右邊......但它只是笑我,仍然顯示該死的默認菜單! 2)如果我把jQuery選擇器放在任何其他元素(除輸入之外),那麼一切都會工作,FF將尊重preventDefault()調用,並且默認的右鍵菜單將不會顯示。

+0

剛剛'返回false'呢? – 2010-04-29 18:08:59

+0

此外,請嘗試'e.which'而不是'e.button'。 – karim79 2010-04-29 18:10:11

+0

可能是相關的http://stackoverflow.com/questions/1489817/jquery-liveclick-firing-for-right-click – scott 2010-05-01 03:52:01

回答

3

對不起球員,我知道這是一種逃避的「答案」,因爲我從來沒有能夠準確地找出爲什麼WebKit瀏覽器不喜歡你輸入字段事件但無論搞亂,這工作。因此,解決方案是將偵聽器應用於整個窗口,然後詢問目標是否有要應用該效果的類...並從那裏開始。說實話,無論如何,這可能是一個更好的解決方案,因爲對於我的特定應用程序,這使我可以將此功能應用到我想要的任何元素。

var _class = "input.hideRightClick"; 

this.setListeners = function() { 
    $(window).click(function(e) { 
     if($(e.target).is(_class)) 
     { 
      e.preventDefault(); 
      alert("hide!"); 
     } 
    }); 
} 
0

我剛剛在Firefox 3.6中測試過,它正在進入第一個if語句,所以e.preventDefault()永遠不會被調用。

var webKit = !$.browser.msie && e.button == 0; // TRUE IN FIREFOX 3.6 

    var ie = $.browser.msie && e.button == 1; 

    if(webKit||ie) 
    { 

    // Left mouse...do something() 

    } else if(e.button == 2) { 
    e.preventDefault(); 

    // Right mouse...do something else(); 
    } 
+0

等一下,當你點擊鼠標右鍵時,它會變成真的嗎? A)不應該。 B)它不在我的機器上(FF 3.5.7) – Jason 2010-04-29 21:43:27

+0

另外,即使我在if/else-if之前/之外放置e.preventDefault()(這意味着它應該觸發REGARDLESS),ff似乎不會照顧。 – Jason 2010-04-29 21:44:32

11

一個跨瀏覽器的解決方案來禁用默認的上下文菜單:

window.oncontextmenu = function() { return false }; 

要捕捉contextmenu事件裏面只有一個給定的元素使用:

document.getElementById('myElement').oncontextmenu=function(){ 

    // Code to handle event 
    return false; 
} 

你會得到不同的結果取決於確切的事件場景和瀏覽器,如果嘗試使用oncontextmenu以外的方法來中斷右鍵單擊事件。

在jQuery中:

$('myElement').bind('contextmenu', function(){ 

    // Handle right-click event. 
    return false; 
}); 

您還可以使用jQuery的事件。要確定哪個按鈕被按下,但你還是要取消默認contextmenu事件:

// Cancel default oncontextmenu event. 
    $(element).bind('contextmenu', function(){ return false }); 

    $(element).mousedown(function(event){ 

     switch (event.which) 

      case 1: 
      // Left mouse 
      break; 

      case 2: 
      // Middle mouse 
      break; 

      case 3: 
      // Right mouse. 
      break; 

    }); 

我在IE6(下酒),鉻11,火狐3.6,歌劇11和Safari瀏覽器測試這一點。

+0

感謝這個韋恩,好東西! – 2012-09-16 17:15:09

+0

爲什麼'if(event.which == 3){// something}'取消了contextmenu禁用的任何原因? – Andreas 2012-09-17 15:14:42

相關問題