Declaración de variables

Tengo un problemilla bastante curioso.
En una form tengo un text box y tres radio buttons. Los radios tienen el mismo nombre. Por lo tanto puedo acceder al vector con los 3 objetos mediante document. Formulario.nombreRadios.
A este vector quiero asignarle una propiedad. Digámosle miVariable. Al OnLoad de la página llamo a la función inicio() que, a su vez, llama a inicializarVariables().
Una línea de esta función es como la siguiente:
document.formulario.nombreRadios.miVariable=true;
Pues bien. Después de llamar a inicializarVariables() he hecho una llamada como la siguiente(aún dentro de la función inicio() ).
alert(document.formulario.nombreRadios.miVariable);
Mi función inicializarVariables() es muy extensa. Lo curioso es que dependiendo de en que linea haya inicializado miVariable, el alert da como resultado true o undefined.
También se da el caso de que da true en la función inicio(), pero cuando pongo el mismo alert en otra función, me da undefined.
¿Tienes alguna idea de que puede estar pasando?
Yo me estoy volviendo loco. Gracias
Respuesta
1
Lo que me describes es correcto. Debe haber un error en alguna otra parte, porque nada te impide asignar propiedades a un array y recuperar más tarde su valor. Esa es precisamente una de las grandes fortalezas de Javascript: poder extender los objetos (por su prototipo, o individualmente) en tiempo de ejecución.
He escrito un pequeño caso de prueba que he probado en Explorer 5.5 y en Mozilla 0.9.1 sin ningún problema. Te lo adjunto para estar seguro de que te entendí correctamente:
<html>
<head>
<script>
function assignProperty() {
document.forms[0].rdo.miVar=true;
}
</script>
</head>
<body onload="assignProperty()">
<form>
<input type="text" name="txt"><br>
<input type="radio" name="rdo" value="1">
<input type="radio" name="rdo" value="2">
<input type="radio" name="rdo" value="3"><br>
<input type="button" value="Ver" onclick="alert(this.form.rdo.miVar)">
</form>
</body>
</html>
La asignación de miVar se hace en el onload de BODY, y puedes recuperar el valor en cualquier momento pulsando el botón. ¿Tal vez tu error esté en otro sitio?
Te propongo la siguiente metodología:
1) Determina si el fallo ocurre siempre en el mismo lugar del código. Para ello, inserta alerts que muestren el valor, y muévelos poco a poco, alejándolos de la definición. No cambies más código mientras haces eso.
Si encuentras que el fallo es determinista, ya sabes "qué" está borrando tu propiedad...
Si el fallo no es determinista, entonces la propiedad no está bien definida (por ejemplo, se puede definir una propiedad en tiempo de carga que después sea sobreescrita por otra del DOM al cargar más elementos en la página; este tipo de fallos dependen de la velocidad de descarga y de si actúa o no la caché...)
2) Vigila el orden de ejecución. Intenta no ejecutar nada en tiempo de carga, si puedes evitarlo. El evento onload te asegura que toda la página ha terminado de cargar, y por tanto que todos los elementos manipulables existen.
3) Si pones en marcha temporizadores en tiempo de carga (antes del onload) vigila bien qué hacen. Los errores con setTimeout/setInterval son difíciles de depurar.
4) Si todo te falla, no desesperes. Elimina funcionalidad de tu página poco a poco hasta que el error desaparezca. Si no consigues que desaparezca sin eliminar la asignación de propiedad...
5) ... O si el caso de prueba que te mando no te funciona... Entonces es tu navegador el que tiene un bug. Dímelo, y prescinde de la asignación de propiedad. Sin duda lo puedes hacer de otra manera. No dudes en preguntarme más si necesitas ideas.
Que tengas mucha suerte... y un saludo.
Bruckner
Te adjunto la función que inicializa las variables. Como puedes ver es muy extensa. El vector al que me refiero está marcado con un *. Lo curioso del caso es que bajando la definición ¡Dos líneas!, la variable es visible solo una vez. Es decir al hacer dos alerts de la variable en otra función, solo funciona correctamente la primera vez. Solo una pregunta por curiosidad (ya lo he solucionado sin definir la propiedad): ¿Crees que la extensión de la función puede provocar el error. Es decir, el numero de propiedades declaradas? Gracias
function inicializarVariables()
{
//Funcionalidad: restricciones
var radiosDeFidioma=document.forms["fidioma"].elements["titulo"];
for(i=0;i<radiosDeFidioma.length;i++)
{
if(radiosDeFidioma.value=="si")
{radiosDeFidioma.restringirSiSeleccionado=false;}
else if(radiosDeFidioma.value=="no")
{radiosDeFidioma.restringirSiSeleccionado=true;}
radiosDeFidioma.vectorPosiblesRestringidos=[document.forms["fidioma"].elements["nivel"]];
}
document.forms["fidioma"].elements["nivel"].disabled=true;
document.forms["fnacionalidad"].elements["nacionalidad"].vectorPosiblesRestringidos=[document.forms["fnacionalidad"].elements["permiso"]];
document.forms["fnacionalidad"].elements["permiso"][0].disabled=true;
document.forms["fnacionalidad"].elements["permiso"][1].disabled=true;
document.forms["festudios"].elements["estudios"].vectorPosiblesRestringidos=[document.forms["festudios"].elements["especialidad"]];
document.forms["festudios"].elements["especialidad"].disabled=true;
document.forms["lenguajes"].elements["general"].vectorPosiblesRestringidos=[document.forms["lenguajes"].elements["otrosTiposLenguaje"],document.forms["lenguajes"].elements["experiencia1.2"]];
document.forms["lenguajes"].elements["otrosTiposLenguaje"].restringirSiEscrito=true;
document.forms["lenguajes"].elements["otrosTiposLenguaje"].vectorPosiblesRestringidos=[document.forms["lenguajes"].elements["general"],document.forms["lenguajes"].elements["experiencia1"]];
document.forms["fherramientas"].elements["sherramientas"].vectorPosiblesRestringidos=[document.forms["fherramientas"].elements["otrosTiposHerramienta"],document.forms["fherramientas"].elements["experiencia2.2"]];
document.forms["fherramientas"].elements["otrosTiposHerramienta"].restringirSiEscrito=true;
document.forms["fherramientas"].elements["otrosTiposHerramienta"].vectorPosiblesRestringidos=[document.forms["fherramientas"].elements["sherramientas"],document.forms["fherramientas"].elements["experiencia2"]];
document.forms["fbd"].elements["otrosTiposBaseDeDatos"].restringirSiEscrito=true;
document.forms["fbd"].elements["otrosTiposBaseDeDatos"].vectorPosiblesRestringidos=[document.forms["fbd"].elements["bd"],document.forms["fbd"].elements["experiencia4"]];
document.forms["fbd"].elements["bd"].vectorPosiblesRestringidos=[document.forms["fbd"].elements["otrosTiposBaseDeDatos"],document.forms["fbd"].elements["experiencia4.2"]];
document.forms["fsistemas"].elements["sistemas"].vectorPosiblesRestringidos=[document.forms["fsistemas"].elements["otrosTiposSistema"],document.forms["fsistemas"].elements["ad2"],document.forms["fsistemas"].elements["experiencia3.2"]];
document.forms["fsistemas"].elements["ad"].vectorPosiblesRestringidos=[document.forms["fsistemas"].elements["otrosTiposSistema"],document.forms["fsistemas"].elements["ad2"],document.forms["fsistemas"].elements["experiencia3.2"]];
document.forms["fsistemas"].elements["otrosTiposSistema"].restringirSiEscrito=true;
document.forms["fsistemas"].elements["otrosTiposSistema"].vectorPosiblesRestringidos=[document.forms["fsistemas"].elements["sistemas"],document.forms["fsistemas"].elements["ad"],document.forms["fsistemas"].elements["experiencia3"]];
document.forms["fsistemas"].elements["ad2"].vectorPosiblesRestringidos=[document.forms["fsistemas"].elements["sistemas"],document.forms["fsistemas"].elements["ad"],document.forms["fsistemas"].elements["experiencia3"]];
document.forms["fcom"].elements["com"].vectorPosiblesRestringidos=[document.forms["fcom"].elements["otrosTiposComunicacion"],document.forms["fcom"].elements["adm2"],document.forms["fcom"].elements["experiencia5.2"]];
document.forms["fcom"].elements["adm"].vectorPosiblesRestringidos=[document.forms["fcom"].elements["otrosTiposComunicacion"],document.forms["fcom"].elements["adm2"],document.forms["fcom"].elements["experiencia5.2"]];
document.forms["fcom"].elements["otrosTiposComunicacion"].restringirSiEscrito=true;
document.forms["fcom"].elements["otrosTiposComunicacion"].vectorPosiblesRestringidos=[document.forms["fcom"].elements["com"],document.forms["fcom"].elements["adm"],document.forms["fcom"].elements["experiencia5"]];
document.forms["fcom"].elements["adm2"].vectorPosiblesRestringidos=[document.forms["fcom"].elements["com"],document.forms["fcom"].elements["adm"],document.forms["fcom"].elements["experiencia5"]];
//Funcionalidad: añadir/eliminar/editar elementos de/en una select
document.forms["festudios"].elements["lest"].tipoElemento="select";
document.forms["formu"].elements["lmaster"].tipoElemento="select";
document.forms["lenguajes"].elements["llenguajes"].tipoElemento="select";
document.forms["fherramientas"].elements["lherramientas"].tipoElemento="select";
document.forms["fsistemas"].elements["lsistemas"].tipoElemento="select";
document.forms["fbd"].elements["lbd"].tipoElemento="select";
document.forms["fcom"].elements["lcom"].tipoElemento="select";
document.forms["form01"].elements["otros"].tipoElemento="select";
document.forms["fidioma"].elements["lidioma"].tipoElemento="select";
document.forms["fmotivos"].elements["motivos2"].tipoElemento="select";
document.forms["formultim"].elements["exp"].tipoElemento="select";
document.forms["permisos"].elements["listaPermisos"].tipoElemento="select";
document.forms["fpais"].elements["lpais"].tipoElemento="select";
document.lenguajes.experiencia1.elementosAAnadir=[document.lenguajes.general,document.lenguajes.experiencia1];
document.lenguajes.elements["experiencia1.2"].elementosAAnadir=[document.lenguajes.otrosTiposLenguaje,document.lenguajes.elements["experiencia1.2"]];
document.fherramientas.experiencia2.elementosAAnadir=[document.fherramientas.sherramientas,document.fherramientas.experiencia2];
document.fherramientas.elements["experiencia2.2"].elementosAAnadir=[document.fherramientas.otrosTiposHerramienta,document.fherramientas.elements["experiencia2.2"]];
document.fsistemas.experiencia3.elementosAAnadir=[document.fsistemas.sistemas,document.fsistemas.ad,document.fsistemas.experiencia3];
document.fsistemas.elements["experiencia3.2"].elementosAAnadir=[document.fsistemas.otrosTiposSistema,document.fsistemas.ad2,document.fsistemas.elements["experiencia3.2"]];
document.fbd.experiencia4.elementosAAnadir=[document.fbd.bd,document.fbd.experiencia4];
document.fbd.elements["experiencia4.2"].elementosAAnadir=[document.fbd.otrosTiposBaseDeDatos,document.fbd.elements["experiencia4.2"]];
document.fcom.experiencia5.elementosAAnadir=[document.fcom.com,document.fcom.adm,document.fcom.experiencia5];
document.fcom.elements["experiencia5.2"].elementosAAnadir=[document.fcom.otrosTiposComunicacion,document.fcom.adm2,document.fcom.elements["experiencia5.2"]];
document.festudios.controlarColumnasRepetidas=[1,2];
document.formu.controlarColumnasRepetidas=[1];
document.lenguajes.controlarColumnasRepetidas=[1];
document.fherramientas.controlarColumnasRepetidas=[1];
document.fbd.controlarColumnasRepetidas=[1];
document.fsistemas.controlarColumnasRepetidas=[1,2];
document.fcom.controlarColumnasRepetidas=[1,2];
document.form01.controlarColumnasRepetidas=[1,2];
document.fidioma.controlarColumnasRepetidas=[1];
document.fpais.controlarColumnasRepetidas=[1];
document.fmotivos.controlarColumnasRepetidas=[1];
document.permisos.controlarColumnasRepetidas=[1];
document.formultim.controlarColumnasRepetidas=[1,2,3,4,5];
document.form1.formularioIndependiente=false;
document.formulario.formularioIndependiente=false;
document.form2.formularioIndependiente=false;
document.form3.formularioIndependiente=false;
document.fnacionalidad.formularioIndependiente=false;
document.festudios.formularioIndependiente=true;
document.formu.formularioIndependiente=true;
document.lenguajes.formularioIndependiente=true;
document.fherramientas.formularioIndependiente=true;
document.fsistemas.formularioIndependiente=true;
document.fbd.formularioIndependiente=true;
document.fcom.formularioIndependiente=true;
document.form01.formularioIndependiente=true;
document.fidioma.formularioIndependiente=true;
document.fpais.formularioIndependiente=true;
document.durada.formularioIndependiente=false;
document.ultim_exp.formularioIndependiente=false;
document.perfilProf.formularioIndependiente=false;
document.fmotivos.formularioIndependiente=true;
document.ffuncionesrealizadas.formularioIndependiente=false;
document.fdedicacion.formularioIndependiente=false;
document.permisos.formularioIndependiente=true;
document.fdedicacion2.formularioIndependiente=false;
document.formultim.formularioIndependiente=true;
document.forms["form3"].elements["telefono_contacto_1"].telefono=true;
document.forms["form3"].elements["telefono_contacto_2"].telefono=true;
document.forms["form3"].elements["telefono_trabajo"].telefono=true;
document.forms["form3"].elements["Email"].mail=true;
document.form3.telefono_contacto_1.obligatorio=true;
document.form3.Email.obligatorio=true;
document.festudios.estudios.obligatorio=true;
********* document.festudios.finalizada.obligatorio=true; ************
document.formu.master.obligatorio=true;
document.lenguajes.general.obligatorio=true;
document.lenguajes.otrosTiposLenguaje.obligatorio=true;
document.fherramientas.sherramientas.obligatorio=true;
document.fherramientas.otrosTiposHerramienta.obligatorio=true;
document.fsistemas.sistemas.obligatorio=true;
document.fsistemas.otrosTiposSistema.obligatorio=true;
document.fsistemas.ad.obligatorio=true;
document.fsistemas.ad2.obligatorio=true;
document.fbd.bd.obligatorio=true;
document.fbd.otrosTiposBaseDeDatos.obligatorio=true;
document.fcom.com.obligatorio=true;
document.fcom.otrosTiposComunicacion.obligatorio=true;
document.fcom.adm.obligatorio=true;
document.fcom.adm2.obligatorio=true;
document.form01.nombre_estudio.obligatorio=true;
document.form01.centro.obligatorio=true;
document.form01.duracion.obligatorio=true;
document.form01.certificado.obligatorio=true;
document.fidioma.idioma.obligatorio=true;
document.fidioma.titulo[0].obligatorio=true;
document.fpais.pais.obligatorio=true;
document.fmotivos.motivos1.obligatorio=true;
document.permisos.permiso.obligatorio=true;
document.permisos.vehiculo.obligatorio=true;
document.formultim.periodo.obligatorio=true;
document.formultim.empresa.obligatorio=true;
document.formultim.actividad.obligatorio=true;
document.formultim.categoria.obligatorio=true;
document.formultim.funciones.obligatorio=true;
document.forms["form1"].elements["nombre"].tipoCasilla='texto';
document.forms["form1"].elements["primer_apellido"].tipoCasilla='texto';
document.forms["form1"].elements["segundo_apellido"].tipoCasilla='texto';
document.forms["form2"].elements["direccion"].tipoCasilla='texto';
document.forms["form2"].elements["poblacion"].tipoCasilla='texto';
document.forms["form3"].elements["codigo_postal"].tipoCasilla='num';
document.forms["form3"].elements["codigo_postal"].longitud=5;
document.forms["form3"].elements["telefono_contacto_1"].tipoCasilla='num';
document.forms["form3"].elements["telefono_contacto_1"].longitud=9;
document.forms["form3"].elements["telefono_contacto_2"].tipoCasilla='num';
document.forms["form3"].elements["telefono_contacto_2"].longitud=9;
document.forms["form3"].elements["telefono_trabajo"].tipoCasilla='num';
document.forms["form3"].elements["telefono_trabajo"].longitud=9;
document.forms["form3"].elements["horario_contacto_1"].tipoCasilla='texto';
document.forms["form3"].elements["horario_contacto_2"].tipoCasilla='texto';
document.forms["form3"].elements["horario_trabajo"].tipoCasilla='texto';
document.form3.Email.tipoCasilla="texto";
document.forms["form3"].elements["url"].tipoCasilla='texto';
document.festudios.especialidad.tipoCasilla="texto";
document.formu.master.tipoCasilla="texto";
document.lenguajes.otrosTiposLenguaje.tipoCasilla="texto";
document.fherramientas.otrosTiposHerramienta.tipoCasilla="texto";
document.fsistemas.otrosTiposSistema.tipoCasilla="texto";
document.fbd.otrosTiposBaseDeDatos.tipoCasilla="texto";
document.fcom.otrosTiposComunicacion.tipoCasilla="texto";
document.form01.nombre_estudio.tipoCasilla="texto";
document.form01.centro.tipoCasilla="texto";
document.form01.duracion.tipoCasilla="texto";
document.form01.certificado.tipoCasilla="texto";
document.fidioma.nivel.tipoCasilla="texto";
document.forms["durada"].elements["duracion"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["periodo"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["empresa"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["departamento"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["cliente"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["categoria"].tipoCasilla="texto";
document.forms["ultim_exp"].elements["proyecto"].tipoCasilla="texto";
document.forms["perfilProf"].elements["puesto_trabajo"].tipoCasilla="texto";
document.forms["perfilProf"].elements["perfil"].tipoCasilla="texto";
document.ffuncionesrealizadas.objetivos.tipoCasilla="texto";
document.forms["fdedicacion"].elements["horario"].tipoCasilla="texto";
document.forms["fdedicacion2"].elements["destino"].tipoCasilla="texto";
document.formultim.periodo.tipoCasilla="texto";
document.formultim.empresa.tipoCasilla="texto";
document.formultim.categoria.tipoCasilla="texto";
document.formultim.funciones.tipoCasilla="texto";
document.forms["formulario"].elements["edad"].vengoDe="arriba";
}//inicializarVariables
No quiero ni pensar en qué aplicación te ha obligado a escribir semejante ladrillo... Pero cabe la posibilidad de que hayas superado algún límite interno en lo que concierne a añadir propiedades a objetos predefinidos. A todo esto, no has llegado a decirme qué navegador y bajo qué plataforma estabas trabajando. ¿Has probado a cambiar (de navegador, por ejemplo)?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas