¿Cómo hacer que el elemento html parezca "deshabilitado", pero pasa valores?


Cuando estoy deshabilitando un

<select name="sel" disabled>
    <option>123</option>
</select>

Elemento, no pasa su variable.

¿Qué hacer para que parezca deshabilitado, pero estar en estado "normal"?

Esto se debe a que tengo una lista de "selects", y a veces algunos de ellos tienen un solo valor, por lo que el usuario debe entender que solo tiene un valor sin hacer clic en él.

Author: Sruit A.Suk, 2012-10-07

8 answers

Puede mantenerlo deshabilitado como desee y luego eliminar el atributo deshabilitado antes de enviar el formulario.

$('#myForm').submit(function() {
    $('select').removeAttr('disabled');
});

Tenga en cuenta que si confía en este método, también querrá deshabilitarlo mediante programación, porque si JS está deshabilitado o no es compatible, se quedará atascado con la selección deshabilitada.

$(document).ready(function() {
    $('select').attr('disabled', 'disabled');
});
 50
Author: tomaroo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-08 10:26:34
<select id="test" name="sel">
  <option disabled>1</option>
  <option disabled>2</option>
</select>   

O puede usar jQuery

$("#test option:not(:selected)").prop("disabled", true);
 11
Author: dingyuchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-27 22:07:11

Mi solución fue crear una clase deshabilitada en CSS:

.disabled {
    pointer-events: none;
    cursor: not-allowed;
}

Y entonces su selección sería:

<select name="sel" class="disabled">
    <option>123</option>
</select>

El usuario no podría elegir ningún valor, pero el valor select aún se pasaría al enviar el formulario.

 9
Author: Denis Priebe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 20:12:20

Si puede proporcionar un valor predeterminado para sus selects, puede usar el mismo enfoque para las casillas de verificación sin marcar que requieren una entrada oculta antes del elemento real, ya que estos no publican un valor si se deja sin marcar:

<input type="hidden" name="myfield" value="default" />
<select name="myfield">
    <option value="default" selected="selected">Default</option>
    <option value="othervalue">Other value</option>
    <!-- ... //-->
</select>

Esto realmente publicará el valor "default" (sin comillas, obviamente) si la selección está deshabilitada por javascript (o jQuery) o incluso si su código escribe el html deshabilitando el elemento en sí con el atributo: disabled="disabled".

 6
Author: Kirito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 23:43:32

Agregue una clase .disabled y use este CSS :

​.disabled {border: 1px solid #999; color: #333; opacity: 0.5;}
.disabled option {color: #000; opacity: 1;}​

Demo: http://jsfiddle.net/ZCSRq /

 3
Author: Praveen Kumar Purushothaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-07 15:41:55

Se podría usar un elemento de entrada oculto adicional con el mismo nombre y valor que el de la lista deshabilitada. Esto asegurará que el valor se pase en las variables $_POST.

Eg:

<select name="sel" disabled><option>123</select>
<input type="hidden" name="sel" value=123>
 2
Author: user3654478,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 12:51:38

Wow, yo tenía el mismo problema, pero una línea de código resolvió mi problema. Escribí

$last_child_topic.find( "*" ).prop( "disabled", true );
$last_child_topic.find( "option" ).prop( "disabled", false );   //This seems to work on mine

Envío el formulario a un script php y luego imprime el valor correcto para cada opción mientras era "null" antes.

Dime si esto funciona. Me pregunto si esto sólo funciona en la mía de alguna manera.

 1
Author: user3290525,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-01 08:52:12

Si no desea agregar el attr deshabilitado puede hacerlo programáticamente

Puede desactivar la edición en el elemento <select class="yourClass"> con este código:

//bloqueo selects
  //block all selects
  jQuery(document).on("focusin", 'select.yourClass', function (event) {
    var $selectDiabled = jQuery(this).attr('disabled', 'disabled');
    setTimeout(function(){ $selectDiabled.removeAttr("disabled"); }, 30);
  });

Si quieres probarlo puedes verlo aquí: https://jsfiddle.net/9kjqjLyq /

 0
Author: Robert Blasco Villarroya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 14:34:05