Pregunta

Quiero desactivar el valor por defecto contextMenu cuando un usuario hace clic en un campo de entrada para que yo pueda mostrar una costumbre contextMenu. En términos generales, es bastante fácil de desactivar el menú contextual haciendo algo como:

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

Y, de hecho, yo puedo hacer esto en casi todos los elementos excepto los campos de entrada en FF - conozco a nadie por qué o me podría apuntar hacia algún tipo de documentación

Este es el código correspondiente estoy trabajando con, gracias chicos.

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:

En este momento, después de leer los comentarios me doy cuenta que debo aclarar algunas cosas.

1) El código anterior funciona ... en un sentido. El código es capaz de ordenar a través de la que se hizo clic en el botón, simplemente no le importa que digo e.preventDefault () y el menú del botón derecho todavía aparece. En otras palabras, si se pone una alerta de e.button se podrían obtener su 1 o 0 para la izquierda y 2 para la derecha ... pero se ríe de mí y aún muestra el menú por defecto condenados!

2) Si pongo el selector de jQuery en cualquier otro elemento (que no sea de entrada) entonces todo va a funcionar, FF respetará el llamado a preventDefault () y el menú del botón derecho por defecto no se mostrará.

¿Fue útil?

Solución 2

Lo siento chicos, sé que esto es una "respuesta" salida fácil, porque nunca fui capaz de averiguar exactamente por qué navegadores WebKit no les gusta que jugar con los eventos de campo de entrada, pero cualquiera que sea, esto funciona. Así que la solución es aplicar al oyente a toda la ventana y luego simplemente preguntar si el destino tiene la clase que desea aplicar el efecto a ... e ir de allí. Para ser honesto, esto es probablemente una mejor solución de todos modos porque para mi aplicación particular, esto me permite aplicar esta funcionalidad a cualquier elemento que quiero.

var _class = "input.hideRightClick";

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

Otros consejos

Una solución multi-navegador para desactivar el menú de contexto por defecto:

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

Para capturar el evento contextual sólo en el interior de un elemento dado su uso:

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

    // Code to handle event
    return false;
}

obtendrá resultados diferentes dependiendo del escenario de eventos exacta y el navegador si intenta métodos distintos de OnContextMenu para interrumpir un evento de clic derecho.

En jQuery:

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

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

También puede utilizar event.which de jQuery para determinar qué botón se pulsa, pero todavía tendrá que cancelar el evento contextual por defecto:

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

    });

He probado esto en IE6 (bajo Wine), Chrome 11, Firefox 3.6, Opera 11 y Safari.

Yo sólo probado en Firefox 3.6 y de procedimiento en la primera sentencia if, por lo que el e.preventDefault () no se llama.

  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();
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top