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

Karim Ali
fuente
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

Kanishka Panamaldeniya
fuente
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);
Bertrand D.
fuente
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..

Prabhagaran
fuente
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.

mainak chakraborty
fuente
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:

Lucas Bustamante
fuente
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 );
});     
NL3294
fuente
8

Jquery simple para eliminar las opciones no seleccionadas.

$('#your_dropdown_id option:not(:selected)').remove();
abhi chavda
fuente
También mi solución. Mejor que dejarlos discapacitados.
Gianluca Demarinis
6

Para simplificar las cosas, aquí hay un complemento de jQuery que lo hace sin problemas: https://github.com/haggen/readonly

Arthur Corenzan
fuente
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:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
admirador
fuente
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);
});
Homero
fuente
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.

Awais Tariq
fuente
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.

Andrej
fuente
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.

usuario3427526
fuente
¿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 :)

Hictus
fuente
1

Funciona muy bien

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

Con esto puedo ver las opciones pero no puedo seleccionarlo

Ricardo Mendes
fuente
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/

Alex Turpin
fuente
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 = "";
});
Hendro
fuente
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

Monicalh
fuente
0

html5 compatible:

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

'

Atul Kumar
fuente
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.

DaveInMaine
fuente
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>

Amiya
fuente