¿Cuál es la diferencia entre disabled = "disabled" y readonly = "readonly" para los campos de entrada de formulario HTML?

435

He leído un poco sobre esto, pero parece que no puedo encontrar nada sólido sobre cómo los diferentes navegadores tratan las cosas.

Andy
fuente
relacionado: "¿cómo emular el atributo de solo lectura para una etiqueta de selección y aún así obtener los datos POST?" stackoverflow.com/questions/368813/…
Adrien Be

Respuestas:

729

Un readonlyelemento simplemente no es editable, pero se envía cuando se envía el correspondiente form. Un disabledelemento no es editable y no se envía al enviar. Otra diferencia es que los readonlyelementos pueden enfocarse (y enfocarse cuando se "tabula" a través de un formulario) mientras que los disabledelementos no.

Lea más sobre esto en este gran artículo o la definición de w3c . Para citar la parte importante:

Diferencias clave

El atributo deshabilitado

  • Los valores para los elementos de formulario deshabilitados no se pasan al método del procesador. El W3C llama a esto un elemento exitoso (esto funciona de manera similar a las casillas de verificación de formularios que no están marcadas).
  • Algunos navegadores pueden anular o proporcionar un estilo predeterminado para los elementos de formulario deshabilitados. (Gris o texto en relieve) Internet Explorer 5.5 es particularmente desagradable al respecto.
  • Los elementos de formulario deshabilitados no reciben foco.
  • Los elementos de formulario deshabilitados se omiten en la navegación con pestañas.

El atributo de solo lectura

  • No todos los elementos de formulario tienen un atributo de solo lectura. Lo más notable, las <SELECT>, <OPTION>y <BUTTON>los elementos no tienen atributos de sólo lectura (aunque ambos tienen atributos de movilidad reducida)
  • Los navegadores no proporcionan comentarios visuales anulados por defecto de que el elemento del formulario es de solo lectura. (Esto puede ser un problema ... ver más abajo).
  • Los elementos de formulario con el conjunto de atributos de solo lectura se pasarán al procesador de formularios.
  • Los elementos de formulario de solo lectura pueden recibir el foco
  • Los elementos de formulario de solo lectura se incluyen en la navegación con pestañas.
oezi
fuente
55
en el elemento de solo lectura no puede usar CTRL + C pero puede usar el botón derecho del mouse y seleccionar Copiar.
Rumplin
77
@Rumplin, ¿estás seguro de eso? Acabo de probar y pude copiar con el atajo de teclado en Chrome en OS X.
evanrmurphy
55
"No todos los elementos de formulario tienen un atributo de solo lectura. Lo más notable es que los elementos <SELECT>, <OPTION> y <BUTTON> no tienen atributos de solo lectura (aunque ambos tienen atributos deshabilitados)". Es por eso que a veces tiene que usar el atributo "deshabilitado" con un campo de entrada oculto para formularios seleccionados.
Donato
En la versión actual de Chrome, los elementos de solo lectura no pueden recibir el foco. Esto es problemático si espera que los usuarios puedan desplazarse a través de valores que son más largos que el tamaño de la entrada.
Mike Feltman
55
Entonces, según tengo entendido, eso disabled implica readonly pero readonlyno implica disabled. En otras palabras, si un elemento tiene el disabledatributo, no hay necesidad de incluirlo también readonly. ¿Correcto?
chharvey
91

No se activan eventos cuando el elemento tiene el atributo deshabilitado.

Ninguno de los siguientes se activará.

$("[disabled]").click( function(){ console.log("clicked") });//No Impact
$("[disabled]").hover( function(){ console.log("hovered") });//No Impact
$("[disabled]").dblclick( function(){ console.log("double clicked") });//No Impact

Mientras que solo lectura se activará.

$("[readonly]").click( function(){ console.log("clicked") });//log - clicked
$("[readonly]").hover( function(){ console.log("hovered") });//log - hovered
$("[readonly]").dblclick( function(){ console.log("double clicked") });//log - double clicked
Hrishabh Gupta
fuente
35

Desactivado significa que no se enviarán datos de ese elemento del formulario cuando se envíe el formulario. Solo lectura significa que se enviarán todos los datos del elemento, pero el usuario no puede modificarlos.

Por ejemplo:

<input type="text" name="yourname" value="Bob" readonly="readonly" />

Esto enviará el valor "Bob" para el elemento "yourname".

<input type="text" name="yourname" value="Bob" disabled="disabled" />

Esto no enviará nada para el elemento "yourname".

Michael Irigoyen
fuente
66
Ambos readonlyy disabledson valores booleanos. Usar en disabledlugar de disabled="disabled"(lo mismo para solo lectura)
Raptor
55
Ambos son semánticamente correctos. HTML5 te permite usar cualquiera.
Michael Irigoyen
3
La advertencia sin contexto para usar solo los nombres de atributos, sin valores, no es aconsejable, porque entonces el código no será válido XML / XHTML. Sé que muchos desarrolladores no se preocupan por ellos, pero al menos deberían ser conscientes de la trampa. Personalmente, me esfuerzo por cumplir con XHTML, a menos que tenga una razón convincente, que aún no he recibido, por lo que utilizo el formulario largo / duplicado.
underscore_d
1
@ToolmakerSteve ¿Tiene una cita de especificación de que las cadenas vacías son válidas XHTML? Solo puedo encontrar páginas de comentarios que dicen que es válido para HTML5. Todos los que he visto hablar sobre XHTML dicen que su forma para los atributos booleanos debe ser attrname="attrname". De cualquier manera, no parece estar particularmente bien documentado, al menos no que pueda encontrar. Bueno, está esto: w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2 , pero solo menciona específicamente SGML y HTML, no XHTML ... demasiados acrónimos: S
underscore_d
1
... pero omitiendo el bit para HTML, donde la presencia / ausencia es suficiente: obtenemos esto, que presumiblemente se aplica por omisión a XHTML: por lo Boolean attributes may legally take a single value: the name of the attribute itself (e.g., selected="selected").tanto, la cadena vacía no parece ser válida.
underscore_d
1

Si el valor de un cuadro de texto deshabilitado debe mantenerse cuando se borra un formulario (restablecer), disabled = "disabled"debe usarse, ya que el cuadro de texto de solo lectura no retendrá el valor

Por ejemplo:

HTML

Caja de texto

<input type="text" id="disabledText" name="randombox" value="demo" disabled="disabled" />

Botón de reinicio

<button type="reset" id="clearButton">Clear</button>

En el ejemplo anterior, cuando se presiona el botón Borrar, el valor de texto deshabilitado se conservará en el formulario. El valor no se retendrá en el caso deinput type = "text" readonly="readonly"

Syed
fuente