Hola de nuevo:
Me he dado cuenta que el problema no tiene nada que ver con que esté oculto o mostrado. El problema viene porque el select no tiene ningún hijo <option>, y IE lo ignora al enviarlo. La especificación sí que dice que un select debe contener uno o más hijos <option>, así que habrá que ponérselo por defecto.
Me he dado cuenta de esto al probar el ejemplo: Lo he ajustado al validador, y si se envía sin tocar los select no pasa nada, los envía correctamente; pero si cambiamos el primer select (cambiandose consecuentemente los datos del segundo) y volvemos a la primera opción 'Cualquier ubicación' en el primer select, entonces el select 'zona' queda totalmente vacío, sin <option>, y no se envía por IE.
Simplemente, añadamos un <option> vacío, con el valor que tú quieras. Luego ya el visibility o el display lo podemos controlar como queramos.
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
</head>
<body>
<form action="recibidorGET.php" method="get" name="frm">
<select name="loc" onchange="cambiar(this.form.zona)">
<option>Cualquier ubicación</option>
<option>Agaete</option>
<option>Agüimes</option>
</select>
<select name="zona" style="visibility: hidden">
<option></option>
</select>
<input name="Submit" type="submit" value="Enviar" />
</form>
<script type="text/javascript">
<!--
function addOpt(oCntrl, iPos, sTxt, sVal){
var selOpcion=new Option(sTxt, sVal);
eval(oCntrl.options[iPos]=selOpcion);
}
function cambiar(oCntrl){
while (oCntrl.length) oCntrl.remove(0);
oCntrl.style.visibility="visible";
switch (document.frm.loc.selectedIndex){
case 0:
addOpt(oCntrl, 0, "", "");
oCntrl.style.visibility="hidden";
break;
case 1:
addOpt(oCntrl, 0, "Cualquier ubicación", "%%");
addOpt(oCntrl, 1, "Puerto de las Nieves", "(Puerto de Las Nieves)");
addOpt(oCntrl, 2, "Valle de Agaete", "(Valle de Agaete)");
break;
case 2:
addOpt(oCntrl, 0, "Cualquier ubicación", "%%");
addOpt(oCntrl, 1, "Villa de Agüimes", "(Villa de Agüimes)");
addOpt(oCntrl, 2, "Cruce de Arinaga", "(Cruce de Arinaga)");
addOpt(oCntrl, 3, "Playa de Arinaga", "(Playa de Arinaga)");
addOpt(oCntrl, 4, "Polígono industrial de Arinaga", "(Polígono industrial de Arinaga)");
break;
}
}
// -->
</script>
</body>
</html>
Probado en IE y en FF, funciona bien y envía todo. Y valida.
Un saludo