Infelizmente, não existe uma solução "simples". O atributo somente leitura não pode ser aplicado às caixas de seleção. Eu li as especificações do W3 sobre a caixa de seleção e encontrei o culpado:
Se um controle não tiver um valor atual quando o formulário for enviado, os agentes do usuário não precisarão tratá-lo como um controle bem-sucedido. ( http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 )
Isso faz com que o estado desmarcado e o estado desabilitado resultem no mesmo valor analisado.
- readonly = "readonly" não é um atributo válido para caixas de seleção.
- onclick = "event.preventDefault ();" nem sempre é uma boa solução, pois é acionada na própria caixa de seleção. Mas pode funcionar em alguns casos.
- Ativar a caixa de seleção onSubmit não é uma solução, porque o controle ainda não é tratado como um controle bem-sucedido, para que o valor não seja analisado.
- Adicionar outra entrada oculta com o mesmo nome em seu HTML não funciona porque o primeiro valor de controle é substituído pelo segundo valor de controle, pois tem o mesmo nome.
A única maneira completa de fazer isso é adicionar uma entrada oculta com o mesmo nome com javascript ao enviar o formulário .
Você pode usar o pequeno trecho que fiz para isso:
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);
}
}
}
Ele procura o primeiro formulário no documento, reúne todas as entradas e pesquisa entradas desativadas. Quando uma entrada desativada é encontrada, uma entrada oculta é criada no parentNode com o mesmo nome e o valor 'on' (se o estado estiver 'marcado') e '' (se o estado for '' - não marcado).
Esta função deve ser acionada pelo evento 'onsubmit' no elemento FORM como:
<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>