Foros del Web » Programando para Internet » Javascript »

document.frm["pregunta"+n].value no me lee

Estas en el tema de document.frm["pregunta"+n].value no me lee en el foro de Javascript en Foros del Web. Hola ,amigos. Depsués de un buen rato intentando distintas alternativas, no logro definir esta variable con un for. Mejor pongo el código: Código HTML: for ...
  #1 (permalink)  
Antiguo 10/11/2004, 15:29
Avatar de GG
GG
Usuario no validado
 
Fecha de Ingreso: febrero-2002
Ubicación: Santiago, Chile
Mensajes: 195
Antigüedad: 22 años, 2 meses
Puntos: 0
document.frm["pregunta"+n].value no me lee

Hola ,amigos.
Depsués de un buen rato intentando distintas alternativas, no logro definir esta variable con un for.
Mejor pongo el código:
Código HTML:
for (var i = 1; i < 21; i++){ 
	var variable=eval("p"+i);
//esto es lo que no me funciona	
             var comparable=eval("document.frm.pregunta"+i+".value");
	alert("variable :"+ variable +" y comparable:" + comparable);	
	 if (variable==comparable){
		 puntos++;
     } 
	 }
Por fis, una ayudita.
Gracias.
Gabriela

Última edición por GG; 10/11/2004 a las 15:48
  #2 (permalink)  
Antiguo 10/11/2004, 15:33
Avatar de Kaopectate
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: Curaçao (Antillas Holandesas)
Mensajes: 3.179
Antigüedad: 22 años, 4 meses
Puntos: 38
Hola GG.

Pruebalo asi a ver que pasa:

Código PHP:
for (var 121i++){
 eval(
"variable=p" i);
 eval(
"comparable = document.frm.pregunta" ".value");
 
alert("variable :"variable +" y comparable:" comparable);    
 if (
variable == comparable){
  
puntos++;
 } 

Saludos.
  #3 (permalink)  
Antiguo 10/11/2004, 15:54
Avatar de GG
GG
Usuario no validado
 
Fecha de Ingreso: febrero-2002
Ubicación: Santiago, Chile
Mensajes: 195
Antigüedad: 22 años, 2 meses
Puntos: 0
Gracias, Kaopectate. A pesar de que en teoría funciona, en mi archivo, no.
Claro que ahora me di cuenta de que no estoy enviando bien las variables desde el formulario.
Mejor mando el código para que otros ojos, le ayuden a estos a ver
Código HTML:
<form name="frm" id="frm" onSubmit="revisar();" >
<p><input name="pregunta1" type="radio" value="a"> Resuesta A<br>
<input name="pregunta1" type="radio" value="b"> Respuesta B
</p>
<p>
 <input type="submit" name="Submit" value="Responder">
</p>
</form> 
  #4 (permalink)  
Antiguo 10/11/2004, 16:21
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola GG y kao :

No es necesario usar eval...

Lo que se pone entre puntos se puede poner entrcomillado y entrecorchetado...

for (var i = 1; i < 21; i++){
var variable = "p" + i;
var comparable=document.forms.frm["pregunta" + i].value;
// alert("variable :"+ variable +" y comparable:" + comparable);
if (variable == comparable){
puntos++;
}
}

La verdad es que no llego a enterarme de lo que quieres hacer.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 10/11/2004, 16:38
Avatar de GG
GG
Usuario no validado
 
Fecha de Ingreso: febrero-2002
Ubicación: Santiago, Chile
Mensajes: 195
Antigüedad: 22 años, 2 meses
Puntos: 0
Es que es un Cuestionario...
Entonces quiero sacar las respuestas correctas y según eso se abra una u otra ventana.
En resumen el cuento es:
Código PHP:
//Aquí van las respuestas correctas
var p1=a;
var 
p2=b;
....

function 
revisar() {
//recorro las preguntas comparando la respuesta correcta (p1) con la marcada (document.forms.frm.pregunta1.value)
for (var 121i++){ 
//Debe ser con eval porque así me recoge el valor de p1 y no me recoge literalmente"p1"
var variable = eval("p" i);
//El problema es que no me lee la pregunta 1 enviada desde el formulario
var comparable=document.forms.frm["pregunta" i].value
if (
variable == comparable){
puntos++;

if (
puntos<=10
window.open("cualquiercosa.htm","ventana","atrbs")
if (
puntos>10window.open("cualquiercosa2.htm","ventana","atrbs")

Por eso pienso que tal vez el problema está en como llamo a la función, que lo hago así:
Código HTML:
<form name="frm" id="frm" action="#" method="POST" onSubmit="revisar();" >
<p><input name="pregunta1" type="radio" value="a"> Resuesta A<br>
<input name="pregunta1" type="radio" value="b"> Respuesta B
</p>
<p>
 <input type="submit" name="Submit" value="Responder">
</p>
</form> 
Qué te parece?

Última edición por GG; 10/11/2004 a las 16:40
  #6 (permalink)  
Antiguo 10/11/2004, 16:58
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola otra vez:

Voy comprendiendo un poco...

No te interesaría más un array...
var p = [a, b, c, ...];

for(var i = 1; i < 21; i++)
if (p[i] == document.forms.frm["pregunta" + i].value) puntos++;

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 10/11/2004, 17:12
Avatar de GG
GG
Usuario no validado
 
Fecha de Ingreso: febrero-2002
Ubicación: Santiago, Chile
Mensajes: 195
Antigüedad: 22 años, 2 meses
Puntos: 0
pues el array me funciona estupendo con todo lo que es p[i].
Sigo con mi problemita de que no logro obtener un valor con
document.forms.frm["pregunta" + i].value
Debe ser un detallito que no logro ver, ni aunque tuvieran más aumento mis lentes.
Gracias en todo caso, por el ahorro de recursos con el array.
  #8 (permalink)  
Antiguo 10/11/2004, 17:15
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
Hola

Creo que esto está mal:
Código:
var comparable=document.forms.frm["pregunta" + i].value;
Debe ser:
Código:
var comparable=eval("document.frm.pregunta" + i + ".value");
La referencia al form debe ser del modo document.frm o document.forms['frm'], y luego hay que referirse al control dentro del form.

Por otra parte,
Código:
var p1="a";
var p2="b";
Y da error de variable no definida para
Código:
puntos++;
O sea, que hay que añadir (antes del for, creo) un
Código:
var puntos=0
Además, no puedes evaluar el value de un radio así, debes poner una función que recorra las opciones. A ver si la encuentro...
  #9 (permalink)  
Antiguo 10/11/2004, 17:21
Avatar de GG
GG
Usuario no validado
 
Fecha de Ingreso: febrero-2002
Ubicación: Santiago, Chile
Mensajes: 195
Antigüedad: 22 años, 2 meses
Puntos: 0
De acuerdo

Eso debe ser:

Cita:
Además, no puedes evaluar el value de un radio así, debes poner una función que recorra las opciones. A ver si la encuentro...
En realidad lo otro me funcionaba bien.
Efectivamente tenía dentro de mi código el var puntos=0;

Gracias!

Buscaré también
  #10 (permalink)  
Antiguo 10/11/2004, 17:23
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
Ya lo tengo, sabía que lo había hecho hace poco. Es así:
Código:
var comparable=leeRadio(eval("document.frm.pregunta" + i));
con
Código:
function leeRadio(buttonGroup) {
	for (var j = 0; j < buttonGroup.length; j++) {
		if (buttonGroup[j].checked) { break }
	}
	return buttonGroup[j].value
}
  #11 (permalink)  
Antiguo 10/11/2004, 17:27
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola otra vez:

Lo de usar radios no es mi fuerte, pero lo de poner elementos entre corchetes lo tengo muy claro, y sin dudas esta línea:

var comparable=document.forms.frm["pregunta" + i].value;

es correcta (sin considerar la evaluación)

Sobre los radios, creo que deben considerarse como un array... pero es un tema que desconozco.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #12 (permalink)  
Antiguo 10/11/2004, 18:13
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
Discrepo, Caricatos. A ver si estoy equivocado:
1) El formulario se ha definido con el nombre 'form'
Código:
<form name="frm" >
Entonces, la referencia al formulario es directa
document.frm
o bien a través de la matriz de formularios
document.forms[0] suponiendo que sea el primer formulario del documento,
o por su nombre:
document.forms['frm']

2) 'pregunta1' es el nombre del control (input type=radio), que pertenece al formulario. Por tanto, hay que poner la referencia al formulario, un punto y el nombre del control:
document.frm.pregunta1

3) El corchete indica una matriz (array), y no hay ninguna matriz llamada 'frm', entonces
frm[loquesea] no tiene sentido


(Aparte va el problema de conseguir pregunta1, pregunta2, etc como nombres, que ahí estamos de acuerdo)

4) Con respecto al grupo radio, en efecto es una matriz, por eso pongo
if (buttonGroup[j].checked)

No quiero pelear, sino que nos pongamos de acuerdo

Última edición por angsanchez; 10/11/2004 a las 18:14
  #13 (permalink)  
Antiguo 11/11/2004, 02:24
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola otra vez:

Estoy de acuerdo en varias cosas:

Desde luego que tampoco es mi intención pelearme y sí aclarar las cosas, y me parece que no estamos hablando de lo mismo:

Cuando hablas de seleccionar al formulario por su nombre, y lo pones como una cadena (string) entrecorchetado, no estás usando la indexación ordinal (numérica) de la colección de formularios sino la indexación "asociativa"... y es que todas (al menos eso creo) las colecciones de elementos de una página, desde javascript pueden referirse tanto por el índice ordinal (según haya sido declarado), como por su nombre (según el "name" declarado), y si vale para la colección de formularios "forms", también vale para lo colección de elementos "elements"... y tanto forms como elements pueden obviarse (yo suelo obviar elements y no forms.

Esto que te comento, también vale para la colección de imágenes, de links, de anchors...

Y otra cosa que antes comenté es que todo elemento declarado entre puntos (representando una categoría en forma de árbol), puede suplantarse por el entrecorchetado de la cadena que se encuentra entre puntos...

O sea que:
document.forms.frm
... puede declararse también así...
document["forms"]["frm"]
Puedes probarlo (con cualquier colección)...

No solo eso, sino que también puedes crear un arbol de todas las colecciones de nodos de un documento recorriendo el array desde document usando un bucle for de la siguiente manera:
var mostrar = ""
for (elemento in document) {
mostrar += "document['" + elemento + "'] = " + document[elemento] + "<br />\n";
}
document.write(mostrar);

Sobre los radios, tal como comentaba antes, no suelo usarlos, pero me sonaba lo de considerarlos una matríz (de hecho lo había comentado).

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #14 (permalink)  
Antiguo 11/11/2004, 14:28
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
Bueno, caricatos, me has dejado impactado. Me queda mucho por aprender...
  #15 (permalink)  
Antiguo 11/11/2004, 14:48
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Cita:
Iniciado por angsanchez
Bueno, caricatos, me has dejado impactado. Me queda mucho por aprender...
Supongo que estamos de acuerdo. De todos modos, en muchas ocasiones creo saber algo, y resulta que estoy errado.

Para que veas que he trabajado en el tema DOM (que es de lo que hablamos), te voy a pasar un par de links de páginas que he hecho:
Un Inspector DOM: http://www.pepemolina.com/DOM/index.html
y un destripador de la propia página: http://www.pepemolina.com/DOM/destripador.html

Precisamente, con el destripador he usado el eval, pero no es necesario, pero como va bien lo dejo. Desde ahí es fácil saber la lista de atributos, estilos, objetos de una página. Realmente es para perderse.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:34.