Desafortunadamente no hay una solución 'simple'. El atributo readonly no se puede aplicar a las casillas de verificación. Leí la especificación W3 sobre la casilla de verificación y encontré al culpable:
Si un control no tiene un valor actual cuando se envía el formulario, los agentes de usuario no están obligados a tratarlo como un control exitoso. ( http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 )
Esto hace que el estado no verificado y el estado desactivado den como resultado el mismo valor analizado.
- readonly = "readonly" no es un atributo válido para casillas de verificación.
- onclick = "event.preventDefault ();" No siempre es una buena solución, ya que se activa en la casilla de verificación. Pero puede hacer encantos en algunas ocasiones.
- Habilitar la casilla de verificación onSubmit no es una solución porque el control aún no se trata como un control exitoso, por lo que el valor no se analizará.
- Agregar otra entrada oculta con el mismo nombre en su HTML no funciona porque el primer valor de control se sobrescribe con el segundo valor de control, ya que tiene el mismo nombre.
La única forma completa de hacer esto es agregar una entrada oculta con el mismo nombre con javascript al enviar el formulario .
Puedes usar el pequeño fragmento que hice para esto:
function disabled_checkbox() {
var theform = document.forms[0];
var theinputs = theform.getElementsByTagName('input');
var nrofinputs = theinputs.length;
for(var inputnr=0;inputnr<nrofinputs;inputnr++) {
if(theinputs[inputnr].disabled==true) {
var thevalueis = theinputs[inputnr].checked==true?"on":"";
var thehiddeninput = document.createElement("input");
thehiddeninput.setAttribute("type","hidden");
thehiddeninput.setAttribute("name",theinputs[inputnr].name);
thehiddeninput.setAttribute("value",thevalueis);
theinputs[inputnr].parentNode.appendChild(thehiddeninput);
}
}
}
Esto busca el primer formulario en el documento, reúne todas las entradas y busca entradas deshabilitadas. Cuando se encuentra una entrada deshabilitada, se crea una entrada oculta en el ParentNode con el mismo nombre y el valor 'on' (si su estado está 'verificado') y '' (si su estado es '' - no marcado).
Esta función debe ser activada por el evento 'onsubmit' en el elemento FORM como:
<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>