¿Cómo hacer un menú desplegable de solo lectura usando jquery?


91

Estoy usando la siguiente declaración para que sea de solo lectura, pero no funciona.

$('#cf_1268591').attr("readonly", "readonly"); 

No quiero desactivarlo, quiero que sea de solo lectura.


4
¿Cuál sería la diferencia entre un menú desplegable de solo lectura y un menú desplegable estándar?
Leo


¿Es esto realmente un problema de jQuery? ¿O tal vez el menú desplegable simplemente no funciona con el atributo de solo lectura?
Ilia G

Kanishka Panamaldeniya ya le dio la respuesta correcta (debería convertirla en una respuesta en lugar de un comentario).
qbantek

2
El menú desplegable no siempre es de solo lectura. Solo lectura significa que puede ver su valor pero no puede cambiarlo.
Suncat2000

Respuestas:


183
$('#cf_1268591').attr("disabled", true); 

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


26
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.

$('#select_field_id option:not(:selected)').attr('disabled', true);

24
¡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 ...

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Esto funciona para mi..


En la misma línea que su respuesta, eliminé las otras opciones $ ('# cf_1268591 option: not (: selected)'). Remove ();
Seth Winters

20

Esto es lo que busca:

$('#cf_1268591').attr("style", "pointer-events: none;");

Funciona de maravilla.


1
Excelente respuesta, pero tenga en cuenta que esto aún permite seleccionar con pestañas. También debe configurar eltabindex="-1"
uesports135

Gran hombre, necesito esto, ya que está deshabilitado no asignado al modelo gracias por su respuesta.
sina_Islam

13

Establecer un elemento con disabledno enviará los datos, sin embargo, los selectelementos no lo tienen readonly.

Se puede simular un readonlysobre selectel uso de CSS para estilizar y JS para evitar el cambio de pestaña:

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

Entonces úsalo como:

var readonly_select = $('select');
$(readonly_select).attr('readonly', true).attr('data-original-value', $(readonly_select).val()).on('change', function(i) {
    $(i.target).val($(this).attr('data-original-value'));
});

Resultado:


2
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 );
});     

8

Jquery simple para eliminar las opciones no seleccionadas.

$('#your_dropdown_id option:not(:selected)').remove();

También mi solución. Mejor que dejarlos discapacitados.
Gianluca Demarinis


3

Esta línea hace selecciones con el readonlyatributo de solo lectura:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);

2

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/

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

2

La opción más fácil para mí fue seleccionar como de solo lectura y agregar:

onmousedown="return false" onkeydown="return false"

No es necesario escribir ninguna lógica adicional. No hay entradas ocultas o deshabilitadas y luego se vuelven a habilitar al enviar el formulario.


1

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:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

este trabajo:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

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:. ..

<select name="img_size" class="dropDown" id="img_size">
<option value="200">200px
</option><option value="300">300px
</option><option value="400">400px
</option><option value="500">500px
</option><option value="600" selected="">600px
</option><option value="800">800px
</option><option value="900">900px
</option><option value="1024">1024px
</option></select>

<input type="checkbox" name="fullpage" id="fullpage" onChange="onChangeFullpageCheckbox()" />

...

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.


1

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.


¿Puede ampliar el CSS necesario para hacer esto?
Cocowalla

1

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 :)


1

Funciona muy bien

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Con esto puedo ver las opciones pero no puedo seleccionarlo


0

No existe un menú desplegable de solo lectura. Lo que podría hacer es restablecerlo al primer valor manualmente después de cada cambio.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/


3
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"

El Html es:

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

El Jquery es:

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// hacer después de keyup con cadena vacía

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});

0

Tal vez puedas intentarlo de esta manera

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

Esto establece el primer valor del menú desplegable como predeterminado y parece de solo lectura


0

html5 compatible:

`
     $("#cCity").attr("disabled", "disabled"); 
     $("#cCity").addClass('not-allow');

'


0

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.


0

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

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 
    }
  });
});
/*Optional*/

select.disabled {
  color: graytext;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="#" name="my-form">
  <select id="my-select" name="alpha">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
  </select>
</form>
<br/>
<button id="toggle">toggle enable/disable</button>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.