Se me ocurrió una forma de javascript pesado para lograr un estado de solo lectura para casillas de verificación y botones de radio. Se prueba con las versiones actuales de Firefox, Opera, Safari, Google Chrome, así como con las versiones actuales y anteriores de IE (hasta IE7).
¿Por qué no simplemente usar la propiedad para discapacitados que solicita? Al imprimir la página, los elementos de entrada deshabilitados aparecen en color gris. El cliente para el que se implementó esto quería que todos los elementos salieran del mismo color.
No estoy seguro de si se me permite publicar el código fuente aquí, ya que lo desarrollé mientras trabajaba para una empresa, pero seguramente puedo compartir los conceptos.
Con los eventos onmousedown, puede leer el estado de selección antes de que la acción de hacer clic lo cambie. Entonces almacena esta información y luego restaura estos estados con un evento onclick.
<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>
<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>
La parte de JavaScript de esto funcionaría así (nuevamente, solo los conceptos):
var selectionStore = new Object(); // keep the currently selected items' ids in a store
function storeSelectedRadiosForThisGroup(elementName) {
// get all the elements for this group
var radioOrSelectGroup = document.getElementsByName(elementName);
// iterate over the group to find the selected values and store the selected ids in the selectionStore
// ((radioOrSelectGroup[i].checked == true) tells you that)
// remember checkbox groups can have multiple checked items, so you you might need an array for the ids
...
}
function setSelectedStateForEachElementOfThisGroup(elementName) {
// iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
...
// make sure you return false here
return false;
}
Ahora puede habilitar / deshabilitar los botones de radio / casillas de verificación cambiando las propiedades onclick y onmousedown de los elementos de entrada.