Según las especificaciones HTML, la select
etiqueta en HTML no tiene un readonly
atributo, solo un disabled
atributo. Entonces, si desea evitar que el usuario cambie el menú desplegable, debe usarlo disabled
.
El único problema es que las entradas de formulario HTML deshabilitadas no se incluyen en los datos POST / GET.
¿Cuál es la mejor manera de emular el readonly
atributo de una select
etiqueta y aún así obtener los datos POST?
javascript
html
Jrgns
fuente
fuente
Respuestas:
Debe mantener el
select
elementodisabled
pero también agregar otro ocultoinput
con el mismo nombre y valor.Si vuelve a habilitar su SELECT, debe copiar su valor a la entrada oculta en un evento onchange y deshabilitar (o eliminar) la entrada oculta.
Aquí hay una demostración:
fuente
selected
se devuelve el valor, no toda la lista. Entonces, tu sehidden
sienta antes que tuselect
y tiene el valor seleccionado. Si la selección se deshabilita para "solo lectura", la publicación posterior solo contendrá el valor de la entrada oculta. Si la selección está habilitada, la opción seleccionada visible "sobrescribirá / reemplazará" el valor oculto, y ese es el valor que se volverá a publicar.También podríamos usar esto
Deshabilitar todo excepto la opción seleccionada:
De esta manera, el menú desplegable aún funciona (y envía su valor) pero el usuario no puede seleccionar otro valor.
Manifestación
fuente
option
etiquetadisabled
$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Puede volver a habilitar el objeto seleccionado al enviar.
EDITAR : es decir, normalmente deshabilita la etiqueta de selección (con el atributo deshabilitado) y luego la vuelve a habilitar automáticamente justo antes de enviar el formulario:
Ejemplo con jQuery:
Para deshabilitarlo:
Para volver a habilitarlo antes del envío para que se incluyan los datos GET / POST:
Además, puede volver a habilitar cada entrada deshabilitada o seleccionar:
fuente
Otra forma de hacer un
readOnly
atributo a unselect
elemento es mediante el uso decss
podrías hacer como:
MANIFESTACIÓN
fuente
... .on('mouseover', function(){ ... });
pointer-events: none
evita el foco del cursor del mouse. Para evitar también el enfoque del teclado, puede complementarlo difuminando inmediatamente todos los eventos de enfoque:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Probado y funcionando en IE 6, 7 y 8b2, Firefox 2 y 3, Opera 9.62, Safari 3.2.1 para Windows y Google Chrome.
fuente
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
lugar de simplemente cambiar el índice seleccionado en silencio ...not-allowed
y el color de fondo a#CCC
.Solución jQuery simple
Use esto si sus selecciones tienen la
readonly
claseO esto si sus selecciones tienen el
readonly="readonly"
atributofuente
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
funciona bien en selección única. No se requiere una clase de "solo lectura". La selección múltiple es problemática porque si hay más de una opción ya seleccionada y, por lo tanto, no está deshabilitada y un usuario selecciona una de las opciones no deshabilitadas, las otras opciones previamente seleccionadas no se seleccionan.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
para que solo agregue el atributo de solo lectura al elemento, de esta manera no tendrá que tratar las selecciones de manera diferente a cualquier otro tipo. El javascript luego mejora progresivamente el efecto. Tenga en cuenta que esta solución (y la mayoría de las otras) solo ayuda al agente de usuario a proporcionar la mejor experiencia de usuario; en realidad no aplica nada (que debe hacerse del lado del servidor si es necesario).Solución CSS simple:
Esto da como resultado Seleccionar para ser gris con un bonito cursor "deshabilitar" al pasar el mouse
y al seleccionar la lista de opciones está "vacía", por lo que no puede cambiar su valor.
fuente
Otra opción más contemporánea (sin juego de palabras) es deshabilitar todas las opciones del elemento de selección que no sea el seleccionado.
Sin embargo, tenga en cuenta que esta es una característica de HTML 4.0 y es decir, 6,7,8 beta 1 parece no respetar esto.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
fuente
Esta es la mejor solución que he encontrado:
El código anterior deshabilita todas las demás opciones no seleccionadas mientras mantiene habilitada la opción seleccionada. Al hacerlo, la opción seleccionada pasará a los datos posteriores.
fuente
Sé que es demasiado tarde, pero se puede hacer con CSS simple:
El estilo oculta todas las opciones y los grupos cuando la selección está en
readonly
estado, por lo que el usuario no puede cambiar su selección.No se necesitan hacks de JavaScript.
fuente
Aún más fácil: agregue el atributo de estilo a su etiqueta seleccionada :
fuente
Esta es la mejor y más simple solución. Establecerá un atributo readolny en su selección, o cualquier otro atributo como solo lectura de datos, y hará lo siguiente
fuente
Establezca la opción deshabilitada cuando planee que sea de solo lectura y luego elimine el atributo deshabilitado justo antes de enviar el formulario.
fuente
Además de deshabilitar las opciones que no deberían ser seleccionables, quería hacerlas desaparecer de la lista, pero aún así poder habilitarlas si necesito hacerlo más tarde:
Esto busca todos los elementos de selección con un atributo de solo lectura, luego encuentra todas las opciones dentro de las selecciones que no están seleccionadas, luego las oculta y las desactiva.
Es importante separar la consulta jquery en 2 por razones de rendimiento, porque jquery las lee de derecha a izquierda, el código:
primero encontrará todas las opciones no seleccionadas en el documento y luego filtrará las que están dentro de las selecciones con un atributo de solo lectura.
fuente
.prop("disabled", true)
lugarUn enfoque simple del lado del servidor es eliminar todas las opciones excepto la que desea que se seleccione. Por lo tanto, en Zend Framework 1.12, si $ element es un Zend_Form_Element_Select:
fuente
Si deshabilita un campo de formulario, este no se enviará cuando se envíe el formulario. Entonces, si necesitas un
readonly
que funcione comodisabled
pero enviando valores, haga esto:Después de cualquier cambio en las propiedades de solo lectura de un elemento.
fuente
Solución con tabindex. Funciona con select pero también con entradas de texto.
Simplemente use una clase .disabled.
CSS:
JS:
HTML:
Editar: con Internet Explorer, también necesita este JS:
fuente
Siguiendo con la sugerencia de Grant Wagners; Aquí hay un fragmento de jQuery que lo hace con funciones de controlador en lugar de atributos directos onXXX:
fuente
Lo resolví con jquery:
fuente
Si está utilizando jquery validate, puede hacer lo siguiente a continuación, utilicé el atributo deshabilitado sin ningún problema:
fuente
Lo que encontré funciona muy bien, con javascript simple (es decir: no se requiere la biblioteca JQuery), es cambiar el innerHTML de la
<select>
etiqueta al valor restante único deseado.Antes de:
Javascript de muestra:
Después:
De esta manera, no cambiará el efecto visual, y esto POST / GET dentro de
<FORM>
.fuente
En lugar de seleccionar en sí, puede deshabilitar todas las opciones, excepto la opción seleccionada actualmente. Esto da la apariencia de un menú desplegable de trabajo, pero solo la opción que desea pasar es una selección válida.
fuente
solución html:
los de javascript:
para eliminar:
editar: se agregaron métodos de eliminación
fuente
Simplemente, elimine el atributo deshabilitado antes de enviar el formulario.
fuente
disabled="disabled" ->
obtendrá su valor de la base de datos y lo mostrará en el formulario.readonly="readonly" ->
puede cambiar su valor en selectbox, pero su valor no se pudo guardar en su base de datos.fuente
Si el menú desplegable de selección es de solo lectura desde el nacimiento y no necesita cambiar en absoluto, ¿tal vez debería usar otro control? Como un simple
<div>
(más un campo de formulario oculto) o un<input type="text">
?Agregado: si el menú desplegable no es de solo lectura todo el tiempo y se usa JavaScript para habilitarlo / deshabilitarlo, entonces esta sigue siendo una solución: simplemente modifique el DOM sobre la marcha.
fuente
A continuación funcionó para mí:
fuente
Lo logré ocultando el cuadro de selección y mostrando un
span
en su lugar con solo valor informativo. En el caso de deshabilitar la.readonly
clase, también necesitamos eliminar los.toVanish
elementos y mostrar los elementos.toShow
.fuente
En IE pude derrotar el enfoque onfocus => onblur haciendo doble clic. Pero recordar el valor y luego restaurarlo en el evento onchange parece manejar ese problema.
Puede hacer algo similar sin expandir las propiedades utilizando una variable javascript.
fuente
Aquí hay un intento de usar una función jQuery personalizada para lograr la funcionalidad (como se menciona aquí):
fuente