2011-11-30 27 views
13

Posiblemente una pregunta tonta, pero ¿cómo evito que un elemento seleccionado en un formulario muestre su menú desplegable cuando se hace clic en? He intentado lo siguiente:Cómo evitar que se abra el menú de selección

$('select').click (function (e) { 
    console.log (e); 
    return false; 
}); 

y

$('select').click (function (e) { 
    e.preventDefault(); 
    console.log (e); 
}); 

Pero tampoco funcionó.

¿Qué estoy haciendo mal?

EDIT: La razón por la que necesito saber es por un elemento de selección mejorado jquery que debe degradarse con gracia. La idea es que al seleccionar, cuando se hace clic, se abra un cuadro de diálogo de la IU de jquery con una lista bien maquetada de la que el usuario hace su selección (al hacer clic en un elemento de la lista se actualiza el valor de la selección). Si JS está desactivado, la selección debería funcionar de la forma habitual.

El problema es que, además de abrir el cuadro de diálogo, también aparece el menú desplegable, que no es lo que quiero. No puedo simplemente desactivar el control, ya que su valor debe enviarse junto con el resto del formulario.

+1

¿Qué pasa con la desactivación de la misma seleccione? –

+0

Tal vez deberías explicar por qué estás tratando de hacer esto. Realmente no tiene sentido y la respuesta más obvia sería: si no desea que se abra un elemento seleccionado, entonces no use un elemento de selección. – RoToRa

+0

Es para una selección que se supone que se degrada con gracia. Explicación detallada en una edición de pregunta. – GordonM

Respuesta

1

Uso discapacitados

$(this).attr("disabled","disabled"); 
+1

Todavía abrirá la lista de selección antes de deshabilitarla. La mejor opción sería desactivar la selección antes del clic (alguna acción del usuario) o en el evento 'mouseenter'. –

+0

@jSang: tiene usted razón.OP puede hacerlo con la carga o cualquier evento en particular antes de hacer clic en él. – Gowri

+0

Agregar el atributo deshabilitado cambiará el estilo del cuadro de selección para que se atenúe, lo que no suena como la intención del afiche. –

2

Ocultar las opciones seleccionadas al cargar la página (si Javascript habilitado). No se mostrarán cuando se haga clic en la casilla de selección, pero el texto de la primera opción ("Seleccionar una opción", o lo que sea) seguirá apareciendo en el campo de selección.

$(document).ready(function() { 
    $('#idOfSelect option').css('display', 'none'); 
}); 

Actualizado Solución:

$(document).ready(function() { 
    $('#idOfSelect').focusin(function() { 
     $(this).css('display', 'none'); 
     $('body').click(function(event) { 
      $(this).unbind(event); 
      $('#idOfSelect').css('display', 'block'); 
     }); 
    }); 
}); 
+0

Desafortunadamente, ese enfoque no funciona. Hace que todo en el seleccionar desaparezca, incluido el elemento seleccionado actualmente. – GordonM

+0

Hmm ... Esta solución funcionó en Chrome, pero descubrí que (al menos) Firefox oculta el elemento seleccionado, como mencionaste. Añadiré una solución actualizada. –

4

Desde mi experiencia, si tengo que desactivar algo, la manera más fácil de tener otro elemento invisible en él (el uso posicionamiento absoluto) . Cuando quiera permitir el comportamiento predeterminado nuevamente, simplemente oculta el elemento absoluto.

1

Acabo de resolver este problema exacto, manipulando el atributo 'tamaño' de select. No muy elegante, pero funcionó. Espero que te ayude.

<!-- Example select dropdown --> 
<select id="select" onclick="tackleDropdown()"> 
</select> 

<!-- The JS function --> 
<script> 
    function tackleDropdown(){ 
     document.getElementById('select').setAttribute('size', 0); 

     // your code for displaying the jQuery UI dialog (is it colorbox???) 

     // re-enabling the drop down 
     document.getElementById('select').setAttribute('size', document.getElementById('select').options.length); 
    } 
</script> 
45

esto debería funcionar: -

$('#select').on('mousedown', function(e) { 
    e.preventDefault(); 
    this.blur(); 
    window.focus(); 
}); 
+0

Tenemos un ganador. Vi otra solución que omitía this.blur() y window.focus(). No funcionó todo el tiempo; tu solución sí, gracias. –

+0

trabajo superior @ deniz-ozger no creerías cuánto tiempo he quemado tratando de resolver este – Matt

+0

@DaveNottage solo 'preventDefault()' parece funcionar para mí ... puedes compartir otras formas en que no funcionaría ? –

0

Puede, el truco consiste en cancelar el evento MouseDown, no el clic.La cadena de eventos se realiza de tal manera que haga clic y mouseup no puede ocurrir si mousedown fue cancelada:

function cancelDropDown(ev) { 
    ev.preventDefault(); 
} 

document.getElementById("selectElement").addEventListener("mousedown", cancelDropDown, false); 
2

El problema es que usted está utilizando el evento equivocado.

<select onmousedown="(function(e){ e.preventDefault(); })(event, this)"> 
    <option>Some Option</option> 
</select> 

JsFiddle

Cuestiones relacionadas