Desactivar un menú desplegable no se envía. Probaré tu solución.
Karim Ali
3
Un problema al desactivar una selección (desplegable) es que algunos navegadores pierden el foco (por ejemplo, IE9). Esto puede ser un problema si el elemento de selección se deshabilita mientras se procesa una llamada ajax, por ejemplo, ya que se pierde la posición del usuario en el formulario.
Chris
1
Gracias por tu sugerencia. Aunque solo una pregunta; ¿Cómo almacenaría el valor desplegable en un campo oculto? ¿Tendría algún código de ejemplo para eso?
kramer65
2
Otra "solución alternativa" sería habilitar esos campos antes de enviar el formulario. O en mi caso, donde envié los datos en formato JSON (habilitar, obtener datos, deshabilitar nuevamente): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (su formulario)); disabled.attr ('desactivado', 'desactivado');
KDT
4
Deberías estar usando prop()ahora.
alex
144
Tuve el mismo problema, mi solución fue deshabilitar todas las opciones no seleccionadas. Muy fácil con jQuery:
$('option:not(:selected)').attr('disabled',true);
Editar =>
Si tiene varios menús desplegables en la misma página, deshabilite todas las opciones no seleccionadas en el ID de selección como se muestra a continuación.
¡Gran idea! Para usar las mejores prácticas con las versiones actuales de jQuery, usaría el método prop para establecer el valor deshabilitado. ie$('option:not(:selected)').prop('disabled', true);
Chris O'Connell
¡Esta es una solución muy ingeniosa!
Jacques
1
¡SI! gran idea.
Eric
1
Esta debería ser la respuesta n ° 1.
Erwan Clügairtz
22
Pruebe este ... sin deshabilitar el valor seleccionado ...
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ahref="#">Click here to enable readonly</a><select><option>Example 1</option><optionselected>Example 2</option><option>Example 3</option></select>
Enfoque muy bueno, pero el usuario aún puede usar TAB en el teclado para seleccionar un valor.
Ricardo Martins
1
@RicardoMartins gracias, actualizó la respuesta para evitar cambios con TAB
Lucas Bustamante
12
Inhabilitaría el campo. Luego, cuando se envíe el formulario, desactívelo. En mi opinión, esto es más fácil que tener que lidiar con campos ocultos.
//disable the field
$("#myFieldID").prop("disabled",true);//right before the form submits, we re-enable the fields, to make them submit.
$("#myFormID").submit(function(event){
$("#myFieldID").prop("disabled",false);});
Gran (pequeño) fragmento de código, gracias. Deshabilita los menús desplegables para que no se puedan cambiar, pero aún permite que se envíen sus valores. Muy útil.
Alex Hopkins
3
Esta línea hace selecciones con el readonlyatributo de solo lectura:
Este código almacenará primero la selección original en cada menú desplegable. Luego, si el usuario cambia la selección, restablecerá el menú desplegable a su selección original.
//store the original selection
$("select :selected").each(function(){
$(this).parent().data("default",this);});//change the selction back to the original
$("select").change(function(e){
$($(this).data("default")).prop("selected",true);});
Es un artículo antiguo, pero quiero advertir a las personas que lo encontrarán. Tenga cuidado con el atributo deshabilitado con el elemento obtenido por nombre. Extraño, pero parece que no funciona demasiado.
Sí, sé que debería usar prop y no attr, pero al menos ahora prop no funcionará debido a la versión anterior de jquery, y ahora no puedo actualizarlo, no preguntes por qué ... la diferencia html solo se agrega id:. ..
No he encontrado ningún error en el script, y en la versión con nombre no hubo errores en la consola. Pero, por supuesto, puede ser mi error de código.
Descubrí que una mejor manera de hacer esto es usar CSS para eliminar eventos de puntero y modificar la opacidad en el menú desplegable (intente 0.5). Esto le da al usuario la apariencia de que está deshabilitado normalmente, pero aún publica datos.
De acuerdo, esto tiene algunos problemas con la compatibilidad con versiones anteriores, pero en mi opinión, es una mejor opción que solucionar el molesto problema de deshabilitación / solo lectura.
no es bueno si la opción seleccionada actualmente no es la primera en la lista como en este ejemplo: jsfiddle.net/4aHcD/19
Homer
@Homer, el código está destinado a restablecerlo después de cualquier cambio, y funciona en ese sentido. Si desea que se ejecute inicialmente en lugar de cambiar el valor inicial usted mismo por alguna razón, siempre puede llamar al evento de cambio en su elemento después de declarar el evento, usando $("select").change(), así, jsfiddle.net/4aHcD/20
Alex Turpin
2
cuando la página se carga por primera vez, si se selecciona el tercer elemento y el usuario intenta cambiarlo al segundo elemento, su código cambia la selección al primer elemento. No creo que deba hacer eso. Aquí hay un ejemplo de lo que creo que quería el OP, un menú desplegable que no cambiará su valor seleccionado según la interacción del usuario: jsfiddle.net/4aHcD/22
Homer
Lo que necesitaba y lo que pedía el OP era una forma de hacerlo de solo lectura. Eso significa que puede ver el valor o los valores seleccionados, pero no puede cambiarlos. Eso significa que la pantalla imita la apariencia del control editable sin poder editarlo.
Suncat2000
0
Intente hacer una cadena vacía cuando "presione la tecla"
Aquí hay una ligera variación en las otras respuestas que sugieren usar discapacitados. Dado que el atributo "deshabilitado" puede tener cualquier valor y aún deshabilitarlo, puede configurarlo en solo lectura, como disabled = "readonly". Esto deshabilitará el control como de costumbre, y también le permitirá diseñarlo fácilmente de manera diferente a los controles deshabilitados normales, con CSS como:
select[disabled=readonly]{.... styles you like for read-only
}
Si desea que se incluyan datos, envíe, use campos ocultos o habilite antes de enviar, como se detalla en las otras respuestas.
Como dijo @Kanishka, si deshabilitamos un elemento de formulario, no se enviará. He creado un fragmento para este problema. Cuando el elemento de selección está deshabilitado, crea un campo de entrada oculto y almacena el valor. Cuando está habilitado, elimina los campos de entrada ocultos creados.
jQuery(document).ready(function($){var $dropDown = $('#my-select'),
name = $dropDown.prop('name'),
$form = $dropDown.parent('form');
$dropDown.data('original-name', name);//store the name in the data attribute
$('#toggle').on('click',function(event){if($dropDown.is('.disabled')){//enable it
$form.find('input[type="hidden"][name='+ name +']').remove();// remove the hidden fields if any
$dropDown.removeClass('disabled')//remove disable class .prop({
name: name,
disabled:false});//restore the name and enable }else{//disable it var $hiddenInput = $('<input/>',{
type:'hidden',
name: name,
value: $dropDown.val()});
$form.append($hiddenInput);//append the hidden field with same name and value from the dropdown field
$dropDown.addClass('disabled')//disable class.prop({'name': name +"_1",
disabled:true});//change name and disbale }});});
Respuestas:
El menú desplegable siempre es de solo lectura. lo que puedes hacer es desactivarlo
si trabaja con un formulario, los campos deshabilitados no se envían, así que use un campo oculto para almacenar el valor desplegable deshabilitado
fuente
prop()
ahora.Tuve el mismo problema, mi solución fue deshabilitar todas las opciones no seleccionadas. Muy fácil con jQuery:
Editar => Si tiene varios menús desplegables en la misma página, deshabilite todas las opciones no seleccionadas en el ID de selección como se muestra a continuación.
fuente
$('option:not(:selected)').prop('disabled', true);
Pruebe este ... sin deshabilitar el valor seleccionado ...
Esto funciona para mi..
fuente
Esto es lo que busca:
Funciona de maravilla.
fuente
tabindex="-1"
Establecer un elemento con
disabled
no enviará los datos, sin embargo, losselect
elementos no lo tienenreadonly
.Se puede simular un
readonly
sobreselect
el uso de CSS para estilizar y JS para evitar el cambio de pestaña:Entonces úsalo como:
Resultado:
Mostrar fragmento de código
fuente
Inhabilitaría el campo. Luego, cuando se envíe el formulario, desactívelo. En mi opinión, esto es más fácil que tener que lidiar con campos ocultos.
fuente
Jquery simple para eliminar las opciones no seleccionadas.
fuente
Para simplificar las cosas, aquí hay un complemento de jQuery que lo hace sin problemas: https://github.com/haggen/readonly
fuente
Esta línea hace selecciones con el
readonly
atributo de solo lectura:fuente
Este código almacenará primero la selección original en cada menú desplegable. Luego, si el usuario cambia la selección, restablecerá el menú desplegable a su selección original.
http://jsfiddle.net/4aHcD/22/
fuente
La opción más fácil para mí fue seleccionar como de solo lectura y agregar:
No es necesario escribir ninguna lógica adicional. No hay entradas ocultas o deshabilitadas y luego se vuelven a habilitar al enviar el formulario.
fuente
Es un artículo antiguo, pero quiero advertir a las personas que lo encontrarán. Tenga cuidado con el atributo deshabilitado con el elemento obtenido por nombre. Extraño, pero parece que no funciona demasiado.
esto no funciona:
este trabajo:
Sí, sé que debería usar prop y no attr, pero al menos ahora prop no funcionará debido a la versión anterior de jquery, y ahora no puedo actualizarlo, no preguntes por qué ... la diferencia html solo se agrega id:. ..
...
No he encontrado ningún error en el script, y en la versión con nombre no hubo errores en la consola. Pero, por supuesto, puede ser mi error de código.
Visto en: Chrome 26 en Win 7 Pro
Perdón por la mala gramática.
fuente
Descubrí que una mejor manera de hacer esto es usar CSS para eliminar eventos de puntero y modificar la opacidad en el menú desplegable (intente 0.5). Esto le da al usuario la apariencia de que está deshabilitado normalmente, pero aún publica datos.
De acuerdo, esto tiene algunos problemas con la compatibilidad con versiones anteriores, pero en mi opinión, es una mejor opción que solucionar el molesto problema de deshabilitación / solo lectura.
fuente
También puede deshabilitarlo y en el momento en que realiza la llamada de envío habilitarlo. Creo que es la forma más fácil :)
fuente
Funciona muy bien
Con esto puedo ver las opciones pero no puedo seleccionarlo
fuente
No existe un menú desplegable de solo lectura. Lo que podría hacer es restablecerlo al primer valor manualmente después de cada cambio.
http://jsfiddle.net/4aHcD/
fuente
$("select").change()
, así, jsfiddle.net/4aHcD/20Intente hacer una cadena vacía cuando "presione la tecla"
El Html es:
El Jquery es:
// hacer después de keyup con cadena vacía
fuente
Tal vez puedas intentarlo de esta manera
Esto establece el primer valor del menú desplegable como predeterminado y parece de solo lectura
fuente
html5 compatible:
'
fuente
Aquí hay una ligera variación en las otras respuestas que sugieren usar discapacitados. Dado que el atributo "deshabilitado" puede tener cualquier valor y aún deshabilitarlo, puede configurarlo en solo lectura, como disabled = "readonly". Esto deshabilitará el control como de costumbre, y también le permitirá diseñarlo fácilmente de manera diferente a los controles deshabilitados normales, con CSS como:
Si desea que se incluyan datos, envíe, use campos ocultos o habilite antes de enviar, como se detalla en las otras respuestas.
fuente
Como dijo @Kanishka, si deshabilitamos un elemento de formulario, no se enviará. He creado un fragmento para este problema. Cuando el elemento de selección está deshabilitado, crea un campo de entrada oculto y almacena el valor. Cuando está habilitado, elimina los campos de entrada ocultos creados.
Más información
fuente