2010-04-29 9 views
8

Ich möchte das Standard contextMenu deaktivieren, wenn ein Benutzer mit der rechten Maustaste auf ein Eingabefeld klickt, damit ich ein benutzerdefiniertes contextMenu anzeigen kann. Allgemein gesagt, es ist ziemlich einfach, das Rechtsklick-Menü zu deaktivieren, indem Sie wie etwas zu tun:jQuery: preventDefault() funktioniert nicht auf Eingabe/Klick-Ereignisse?

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

Und in der Tat, ich kann dies tun auf fast jedes Elemente AUSSER für Eingabefelder in FF - Wer weiß, warum oder kann weist mich auf eine Dokumentation hin?

Hier ist der relevante Code, mit dem ich arbeite, danke Jungs.

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 

EDIT:

Sorry, nach dem Lesen der Kommentare Ich weiß, dass ich ein paar Dinge klarstellen sollte.

1) Der obige Code funktioniert ... in gewissem Sinne. Der Code ist in der Lage zu sortieren, welche Schaltfläche angeklickt wurde, es ist einfach egal, dass ich e.preventDefault() sage und das Kontextmenü erscheint immer noch. Mit anderen Worten, wenn Sie einen Alarm auf e.button setzen, erhalten Sie Ihre 1 oder 0 für links und 2 für rechts ... aber es lacht mich nur an und zeigt immer noch das verdammte Standardmenü!

2) Wenn ich den jQuery-Selektor auf ein anderes Element (außer Eingabe) setze, dann funktioniert alles, FF wird den preventDefault() -Aufruf respektieren und das Standard-Rechtsklick-Menü wird nicht angezeigt.

+0

was ist mit nur 'return false'? –

+0

Probieren Sie auch 'e.which' statt' e.button'. – karim79

+0

Könnte verwandt sein http://stackoverflow.com/questions/1489817/jquery-liveclick-firing-for-right-click – scott

Antwort

3

Sorry Leute, ich weiß, das ist eine Cop-out „Antwort“ weil ich nie in der Lage war, genau herauszufinden, warum Webkit-Browser Sie mit Eingabefeld Ereignissen verwirren nicht mögen, aber was auch immer, das funktioniert. Die Lösung besteht also darin, den Listener auf das gesamte Fenster anzuwenden und dann zu fragen, ob das Ziel die Klasse hat, auf die der Effekt angewendet werden soll ... und von dort aus weitergeht. Um ehrlich zu sein, ist dies wahrscheinlich eine bessere Lösung, da ich für meine spezielle Anwendung diese Funktionalität auf jedes beliebige Element anwenden kann.

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

Zur Erfassung des contextmenu Ereignisses nur innerhalb einer bestimmten Elements Verwendung:

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

    // Code to handle event 
    return false; 
} 

Sie erhalten unterschiedliche Ergebnisse

var _class = "input.hideRightClick"; 

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

Ich habe gerade in Firefox 3.6 getestet und es geht in die erste if-Anweisung, so dass die e.preventDefault() nie aufgerufen wird.

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

Warten Sie, es ist wahr, wenn Sie die RECHTE Maustaste drücken? A) Es sollte nicht. B) Es ist nicht auf meiner Maschine (FF 3.5.7) – Jason

+0

Auch, wenn ich e.preventDefault() vor/außerhalb der if/else-if (was bedeutet, es sollte REGELNESS auslösen), ff scheint nicht sich kümmern. – Jason

11

Eine Cross-Browser-Lösung, die das Standardkontextmenü deaktivieren Abhängig vom genauen Ereignisszenario und Browser, wenn Sie andere Methoden als oncontextmenu zum Unterbrechen eines Rechtsklick-Ereignisses versuchen.

In jQuery:

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

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

Sie können auch jQuery Ereignis verwenden.die bestimmen, welche Taste gedrückt wurde, aber Sie werden immer noch die Standard-contextmenu Veranstaltung absagen müssen:

// 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; 

    }); 

ich dies in IE6 (unter Wine) getestet haben, Chrome 11, Firefox 3.6, Opera 11 und Safari.

+0

Danke für diesen Wayne, gute Sachen! –

+0

irgendein Grund, warum 'if (event.which == 3) {// something}' das Kontextmenü abschalten deaktiviert? – Andreas

Verwandte Themen