Según las especificaciones HTML, la selectetiqueta en HTML no tiene un readonlyatributo, solo un disabledatributo. 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 readonlyatributo de una selectetiqueta y aún así obtener los datos POST?
javascript
html
Jrgns
fuente
fuente

Respuestas:
Debe mantener el
selectelementodisabledpero también agregar otro ocultoinputcon 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
selectedse devuelve el valor, no toda la lista. Entonces, tu sehiddensienta antes que tuselecty 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
optionetiquetadisabled$("#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
readOnlyatributo a unselectelemento es mediante el uso decsspodrías hacer como:
MANIFESTACIÓN
fuente
... .on('mouseover', function(){ ... });pointer-events: noneevita 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-allowedy el color de fondo a#CCC.Solución jQuery simple
Use esto si sus selecciones tienen la
readonlyclaseO 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
readonlyestado, 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
readonlyque funcione comodisabledpero 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
spanen su lugar con solo valor informativo. En el caso de deshabilitar la.readonlyclase, también necesitamos eliminar los.toVanishelementos 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