Frage

Ich möchte die Standard-contextMenu deaktivieren, wenn ein Benutzer mit der rechten Klicks auf ein Eingabefeld, so dass ich eine benutzerdefinierte contextMenu zeigen kann. Allgemein gesagt, es ist ziemlich einfach, das Rechtsklick-Menü zu deaktivieren, indem Sie so etwas wie tun:

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

Und in der Tat, ich kann dies tun auf fast jedes Elemente mit Ausnahme von Eingabefeldern im FF - jemanden, warum oder mich in Richtung einig Dokumentation zeigen könnte

Hier ist der relevante Code mit denen 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 soll.

1) Der obige Code funktioniert ... in einem gewissen Sinn. Der Code ist in der Lage zu sortieren, durch die Schaltfläche geklickt wurde, es funktioniert einfach nicht egal, dass ich e.preventDefault sagen () und das Rechtsklick-Menü erscheint nach wie vor nach oben. Mit anderen Worten, wenn Sie eine Benachrichtigung auf e.button setzen würden Sie 1 oder 0 für links und 2 für Recht bekommen ... aber es mich nur lacht und zeigt das verdammte Standardmenü!

2) Wenn ich den jQuery-Selektor auf einem anderen Elemente (außer Eingang gesetzt) ??dann alles funktionieren wird, FF wird die prevent () -Aufruf respektieren und das Standardkontextmenü wird nicht angezeigt.

War es hilfreich?

Lösung 2

Sorry Leute, ich weiß, das ist eine Cop-out „Antwort“ weil ich nie in der Lage war, genau herauszufinden, warum Webkit-Browser nicht, wie Sie mit Eingabefeld Ereignissen durcheinander, aber was auch immer, das funktioniert. So ist die Lösung ist es, die Zuhörer auf das gesamte Fenster zu übernehmen und dann fragen Sie einfach, wenn das Ziel die Klasse hat man den Effekt ... und gehen von dort anwenden möchten. Um ehrlich zu sein, ist dies wahrscheinlich eine bessere Lösung trotzdem, weil für meine spezielle Anwendung, diese mir erlaubt, diese Funktionalität auf jedes Element anwenden ich will.

var _class = "input.hideRightClick";

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

Andere Tipps

Eine Cross-Browser-Lösung, die das Standardkontextmenü zu deaktivieren:

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

das contextmenu Ereignis erfassen nur innerhalb eines bestimmten Elements verwenden:

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

    // Code to handle event
    return false;
}

In Kürze erhalten Sie unterschiedliche Ergebnisse je nach dem genauen Ereignisse Szenario und Browser, wenn Sie versuchen, andere Methoden als oncontextmenu zur Unterbrechung eines Rechtsklick Ereignisses.

In jQuery:

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

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

Sie können auch jQuery event.which verwenden, um festzustellen, 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 habe dies in IE6 getestet (unter Wine), Chrome 11, Firefox 3.6, Opera 11 und Safari.

Ich hat gerade getestet in Firefox 3.6 und das Verfahren in dem ersten 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();
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top