Domanda

Voglio disattivare il default contextMenu quando un utente fa clic destro su un campo di input in modo che io possa mostrare una consuetudine contextMenu. In generale, la sua piuttosto facile per disattivare il menu di scelta rapida facendo qualcosa di simile:

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

E infatti, posso fare questo su quasi ogni elemento tranne per i campi di input in FF -? Qualcuno sa perché o mi potrebbe puntare verso una certa documentazione

Ecco il codice relativo sto lavorando con, grazie ragazzi.

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

Modifica

Siamo spiacenti, dopo aver letto i commenti che mi rendo conto che avrei dovuto chiarire un paio di cose.

1) Il codice precedente funziona ... in un certo senso. Il codice è in grado di ordinare attraverso il quale pulsante è stato cliccato, semplicemente non importa quello che dico e.preventDefault () e il menu del tasto destro si apre ancora in piedi. In altre parole, se si mette un avviso sul e.button si dovrebbe ottenere il vostro 1 o 0 per sinistra e 2 per la destra ... ma si ride solo a me e mostra ancora il menu di default dannati!

2) Se metto il selettore jQuery su qualsiasi altro elemento (diverso da quello di ingresso) poi tutto funzionerà, FF rispetterà la () chiamata preventDefault e il menu di default del tasto destro non mostrerà.

È stato utile?

Soluzione 2

Scusate ragazzi, so che questo è un "risposta" poliziotto-out perché non sono mai stato in grado di capire esattamente il motivo per cui i browser WebKit non lo fanno come te scherzi con gli eventi dei campi di input, ma qualunque cosa, questo funziona. Quindi la soluzione è quella di applicare l'ascoltatore a tutta la finestra e poi basta chiedere se il bersaglio ha la classe che si desidera applicare l'effetto ... e passare da lì. Per essere onesti, questa è probabilmente una soluzione migliore in ogni caso, perché per la mia particolare applicazione, questo mi permette di applicare questa funzionalità a qualsiasi elemento che voglio.

var _class = "input.hideRightClick";

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

Altri suggerimenti

Una soluzione cross-browser per disattivare il menu di scelta rapida di default:

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

Per catturare l'evento contextmenu solo all'interno di un determinato uso elemento:

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

    // Code to handle event
    return false;
}

si ottengono risultati diversi a seconda l'esatto scenario dell'evento e browser, se si tenta metodi diversi da oncontextmenu per interrompere un evento tasto destro del mouse.

In jQuery:

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

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

È inoltre possibile utilizzare event.which di jQuery per determinare quale pulsante è stato premuto, ma si dovrà ancora di annullare l'evento di default 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;

    });

Ho provato questo in IE6 (sotto Wine), Chrome 11, Firefox 3.6, Opera 11 e Safari.

Ho appena testato in Firefox 3.6 e di procedere nella prima istruzione if, in modo che l'e.preventDefault () non viene mai chiamato.

  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();
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top