Question

Je veux désactiver l'option par défaut contextMenu lorsqu'un utilisateur droit-clique sur un champ de saisie afin que je puisse montrer une coutume contextMenu. D'une manière générale, son assez facile de désactiver le menu contextuel en faisant quelque chose comme:

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

Et en fait, je peux le faire sur à peu près tous les éléments sauf pour les champs d'entrée dans FF - Quelqu'un sait pourquoi ou pourrait me diriger vers une documentation

Voici le code approprié, je travaille avec, merci les gars.

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:

Désolé, après avoir lu les commentaires, je me rends compte que je dois préciser quelques petites choses.

1) Le code ci-dessus fonctionne ... dans un sens. Le code est capable de trier sur quel bouton a été cliqué, juste ne se soucie pas que je dis e.preventDefault () et le menu contextuel apparaît toujours vers le haut. En d'autres termes, si vous mettez une alerte sur e.button vous obtiendrez votre 1 ou 0 pour la gauche et 2 pour la droite ... mais il se contente de rire et me montre toujours le menu par défaut damnés!

2) Si je mets le sélecteur jQuery sur tout autre élément (autre que l'entrée), puis tout fonctionnera, FF respectera l'appel et le menu par défaut clic droit preventDefault () ne sera pas affiché.

Était-ce utile?

La solution 2

Désolé les gars, je sais que c'est un flic-out « réponse » parce que je n'ai jamais été en mesure de comprendre exactement pourquoi les navigateurs WebKit ne le font pas comme vous embêter avec des événements sur le terrain d'entrée, mais que ce soit, cela fonctionne. Donc, la solution est d'appliquer l'auditeur à la fenêtre entière puis demandez si la cible a la classe que vous voulez appliquer l'effet ... et aller de là. Pour être honnête, ce qui est probablement une meilleure solution de toute façon parce que pour mon application particulière, cela me permet d'appliquer cette fonctionnalité à tout élément que je veux.

var _class = "input.hideRightClick";

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

Autres conseils

Une solution multi-navigateur pour désactiver le menu de contexte par défaut:

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

Pour capturer l'événement contextmenu seulement à l'intérieur d'une utilisation d'élément donné:

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

    // Code to handle event
    return false;
}

Vous obtiendrez des résultats différents selon le scénario de l'événement exact et navigateur si vous essayez des méthodes autres que oncontextmenu pour interrompre un événement clic droit.

Dans jQuery:

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

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

Vous pouvez également utiliser event.which jQuery pour déterminer quel bouton a été pressé, mais vous aurez toujours annuler l'événement contextmenu par défaut:

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

    });

Je l'ai testé cela dans IE6 (sous Wine), 11 Chrome, Firefox 3.6, Opera 11 et Safari.

Je viens de tester dans Firefox 3.6 et de procédure dans la première instruction if, de sorte que le e.preventDefault () ne soit jamais appelé.

  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();
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top