Foros del Web » Programando para Internet » Jquery »

Cómo crear una encuesta/quiz inteligente con jquery

Estas en el tema de Cómo crear una encuesta/quiz inteligente con jquery en el foro de Jquery en Foros del Web. Buenas! Llevo días intentando crear una encuesta inteligente, las he visto en compañias de seguros como https://www.rastreator.com/seguro-co...mparativa.aspx Te va haciendo preguntas, marcas tu respuesta y ...

  #1 (permalink)  
Antiguo 05/09/2010, 05:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Cómo crear una encuesta/quiz inteligente con jquery

Buenas!

Llevo días intentando crear una encuesta inteligente, las he visto en compañias de seguros como
https://www.rastreator.com/seguro-co...mparativa.aspx

Te va haciendo preguntas, marcas tu respuesta y automaticamente te carga la nueva pregunta con sus respuesta, todo sin recargar la pagina completa.

He intentado buscar algo parecido en la red pero no he encontrado nada, así que estoy intentado crearlo, pero mis conocimientos de javascript y jquery son limitados y no sé como se implementaría un sistema similar.

Me surgen dudas, he estado analizando esa misma página para ver como llamaba y recibia los datos, y veo que no utiliza json ni xml, esta es respuesta de la pagina al solicitarle una nueva pregunta.

|¿Dónde aparcas habitualmente por la noche?|1:En la calle~2:En garaje colectivo~3:En garaje individual

Cómo se aprecia tan solo separa las opciones con un tuberias | y ~ en el caso de las posibles respuestas

¿Vosotros que me aconsejáis que utilice json, xml?

He intentado empezar de la siguiente manera

index.php
Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/v1.98/DTD/v1.98-strict.dtd">
  2. <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en"><head>
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. <title>Ejemplo de encuesta inteligente</title>
  5. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
  6. <script type="text/javascript">
  7. $(document).ready(function() {
  8.  
  9.     function Empezar(){
  10.         $('a.empezar_quiz').click(function() {
  11.             $('#cuestionario').load('preguntas.php?q=1'); //carga la primera pregunta
  12.         });
  13.     }
  14.    
  15.     Empezar();
  16.    
  17.     $("#cuestionario dl dd").click( function () {
  18.         $(this).toggleClass('activo');
  19.         var n = $('.activo').length;
  20.         $("span").text("Hay " + n + " elementos seleccionados");
  21.     });
  22.    
  23.     // Una vez empieza el test el boton empezar debe desaparecer
  24.     //$('a.empezar_quiz').hide();
  25.  
  26. });
  27. <style type="text/css">
  28. #cuestionario {
  29.     padding:10px;
  30.     margin:0px;
  31.     list-style:none;
  32. }
  33. #cuestionario dd {
  34.     display:block;
  35.     height:18px;
  36.     text-decoration:none;
  37.     color:#666666 !important;
  38.     padding:1px 5px 1px 5px;
  39.     border:1px solid #ffffff;
  40. }
  41. #cuestionario dd:hover {
  42.     border:1px solid #e53500;
  43.     text-decoration:none;
  44. }
  45. .activo{
  46.     background:red;
  47.     font-weight:bold;
  48.     color:#fff;
  49. }
  50. </head>
  51. <a class="empezar_quiz" href="#"> Empezar con las preguntas</a>
  52.  
  53. <!-- Carga las preguntas y respuestas -->
  54. <div id="cuestionario"></div>
  55.  
  56. <!-- DEBUG: muestra las respuestas seleccionadas -->
  57.  
  58. </body>
  59. </html>


preguntas.php
Código PHP:
Ver original
  1. <?php
  2. if ($_GET['q']==1){?>
  3. <dl>
  4.     <dt>Pregunta 1: <b>Selecciona 3 colores:</b></dt>
  5.     <dd>Rojo</dd>
  6.     <dd>Verde</dd>
  7.     <dd>Azul</dd>
  8.     <dd>Amarillo</dd>
  9.     <dd>Negro</dd>
  10.     <dd>Naranja</dd>
  11. </dl>
  12. <?php } ?>

Pero la parte de marcar las opciones no me funciona.

Y no se como hacer para irle pidiendo nuevas preguntas una vez el usuario pulse sobre la respuesta...

Dejo el ejemplo online: http://neodani.com/fdw/jquery/quiz/

¿Podéis ayudarme?

Muchas gracias de antemano!

Última edición por neodani; 05/09/2010 a las 05:59
  #2 (permalink)  
Antiguo 05/09/2010, 11:31
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

puedes probar algo asi, sino entiendes algo preguntame por aca mismo.

HTML
Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/v1.98/DTD/v1.98-strict.dtd">
  2. <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en"><head>
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. <title>Ejemplo de encuesta inteligente</title>
  5.  
  6. <style type="text/css">
  7. #cuestionario {
  8.     padding:10px;
  9.     margin:0px;
  10.     list-style:none;
  11. }
  12. #cuestionario dd {
  13.     display:block;
  14.     height:18px;
  15.     text-decoration:none;
  16.     color:#666666 !important;
  17.     padding:1px 5px 1px 5px;
  18.     border:1px solid #ffffff;
  19. }
  20. #cuestionario dd:hover {
  21.     border:1px solid #e53500;
  22.     text-decoration:none;
  23.     cursor:pointer;
  24. }
  25. .activo{
  26.     background:red;
  27.     font-weight:bold;
  28.     color:#fff;
  29. }
  30. #next{ width:100px; border:solid 1px #CCC; text-align:center; display:none;}
  31. #next:hover{ background:#009; color:#FFF; cursor:pointer;}
  32.  
  33. <script src="jquery.js" type="text/javascript"></script>
  34. <script type="text/javascript">
  35. $(document).ready(function() {
  36.     var question = 0;
  37.    
  38.     function loadQuestion(){       
  39.         $('#cuestionario').html('').load('preguntas.php?q='+(++question));
  40.     }
  41.  
  42.     $('a.empezar_quiz').click(function() {
  43.         loadQuestion()
  44.         $(this).hide();
  45.         $('#next').show();     
  46.     });
  47.    
  48.     $('#next').click(function(){
  49.         if(getN() == $('.activo').length){
  50.             var val = $('#answers').val();
  51.             val = (val != '')?val+'|':val;
  52.            
  53.             var respuestas = '';
  54.             $('.activo').each(function(i){
  55.                 respuestas += $(this).attr('id').split('-')[1];
  56.                 if(i!= ($('.activo').length-1))
  57.                     respuestas+=',';
  58.             });
  59.            
  60.             val += getPregunta()+':'+respuestas;
  61.             $('#answers').val(val);
  62.             loadQuestion();
  63.         }else{
  64.             var n = getN();
  65.             var text = (n > 1)?' preguntas':' pregunta';
  66.             alert('Debe seleccionar '+getN()+text);
  67.         }
  68.     });
  69.        
  70.     function getN(){
  71.         return $("#cuestionario dl").attr('class').split('n')[1].split(']')[0].split('[')[1];
  72.     }
  73.    
  74.     function getPregunta(){
  75.         return $("#cuestionario dl").attr('id').split('-')[1];
  76.     }
  77.    
  78.     $("#cuestionario dl dd").live('click', function () {
  79.         if($(this).hasClass('activo') || $('.activo').length < getN()){
  80.             $(this).toggleClass('activo');
  81.             //$("#debug").text("Hay " + $('.activo').length + " elementos seleccionados");
  82.         }
  83.    });
  84.    
  85.    // Una vez empieza el test el boton empezar debe desaparecer
  86.    //$('a.empezar_quiz').hide();
  87. });
  88.  
  89. </head>
  90. <a class="empezar_quiz" href="#"> Empezar con las preguntas</a>
  91.  
  92. <!-- Carga las preguntas y respuestas -->
  93. <div id="cuestionario"></div>
  94.  
  95. <!-- Aqui se guardaran las respuestas -->
  96. <input id="answers" name="answers" type="hidden" value="" />
  97.  
  98. <div id="next">Continuar</div>
  99.  
  100. <!-- DEBUG: muestra las respuestas seleccionadas -->
  101. <span id="debug"></span>
  102.  
  103. </body>
  104. </html>

PHP
Código PHP:
Ver original
  1. <?php
  2. //EN EL ID DE CADA dl COLOCAMOS q- SEGUIDO POR EL NUMERO DE LA PREGUNTA, ESTO ES PARA SABER EN QUE PREGUNTA VAMOS
  3. //CADA RESPUESTA SERA ALGO PARECIDO, TENDRA UN ID r- SEGUIDO POR EL NUMERO DE LA RESPUESTA
  4. //LA CLASE QUE TIENE EL dl, SERA PARA INDICAR CUANTAS PREGUNTAS DEBEN SER SELECCIONADAS ANTES DE CONTINUAR
  5. echo 'aqui '.$_REQUEST['q'];
  6.  
  7. if ($_GET['q']==1){?>
  8. <dl id="q-1" class="n[3]">
  9.     <dt>Pregunta 1: <b>Selecciona 3 colores:</b></dt>
  10.     <dd id="r-1">Rojo</dd>
  11.     <dd id="r-2">Verde</dd>
  12.     <dd id="r-3">Azul</dd>
  13.     <dd id="r-4">Amarillo</dd>
  14.     <dd id="r-5">Negro</dd>
  15.     <dd id="r-6">Naranja</dd>
  16. </dl>
  17. <?php }elseif($_GET['q']==2) {?>
  18. <dl id="q-2" class="n[1]">
  19.     <dt>Pregunta 2: <b>Que lenguaje de programacion te gusta mas?</b></dt>
  20.     <dd id="r-1">JAVA</dd>
  21.     <dd id="r-2">PHP</dd>
  22.     <dd id="r-3">ASP</dd>
  23.     <dd id="r-4">C</dd>
  24. </dl>
  25. <?php }?>
  #3 (permalink)  
Antiguo 05/09/2010, 16:04
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
puedes probar algo asi, sino entiendes algo preguntame por aca mismo.
Muchas gracias tredio!, he copiado los archivos y los he subido al servidor, están accesibles desde http://neodani.com/fdw/jquery/quiz/

¿De qué manera se te ocurre para mostrar una pregunta u otra en función de la respuesta?

El script preguntas.php debería recibir un array con las respuestas que el usuario ha seleccionado para así formularle la siguiente pregunta, no?

¿Se te ocurre cómo?

Muchas gracias de antemano
  #4 (permalink)  
Antiguo 05/09/2010, 17:14
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

no necesariamente enviar un arrglo, solo con enviar el numero de la pregunta, cosa que tenemos en question, y la respuesta que eligio basta, todo lo demas serian condicionales de PHP para hacer el trabajo. intenta algo y partimos de ahi.
  #5 (permalink)  
Antiguo 06/09/2010, 00:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
no necesariamente enviar un arrglo, solo con enviar el numero de la pregunta, cosa que tenemos en question, y la respuesta que eligio basta, todo lo demas serian condicionales de PHP para hacer el trabajo. intenta algo y partimos de ahi.
Intenté crear una función especifica para recoger las respuestas

Código Javascript:
Ver original
  1. //function getRespuesta(){
  2.     //    return $("#cuestionario dl dd").attr('id').split('-')[1];
  3.     //}

Pero no me funcionaba al llamarla dentro de aquí (así que tuve que definirla dentro, está con un alert para hacer pruebas...

Código Javascript:
Ver original
  1. $("#cuestionario dl dd").live('click', function () {
  2.         if($(this).hasClass('activo') || $('.activo').length < getN()){
  3.            $(this).toggleClass('activo');
  4.            alert($(this).attr('id').split('-')[1]); // muestra mensaje con el numero de respuesta seleccionado
  5.         }
  6.     });

El alert muestra el valor de la respuesta seleccionada, ahora este valor es el que se tendría que ir guardando... para luego pasárselo como parámetro a la función loadQuestion(), no?

Código Javascript:
Ver original
  1. var respuesta = 0;
  2.    
  3.     function loadQuestion(){        
  4.         $('#cuestionario').html('').load('preguntas.php?q='+(++question)'&r='+respuesta);
  5.     }

Qué tal? :D la idea la tengo... implementarla es mucho más difícil!
  #6 (permalink)  
Antiguo 06/09/2010, 11:23
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

creo que no has entendido del todo el script que te pase, te explico para que veas.
te coloco los comentarios.

Cita:
Iniciado por tredio Ver Mensaje

HTML
Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/v1.98/DTD/v1.98-strict.dtd">
  2. <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en"><head>
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. <title>Ejemplo de encuesta inteligente</title>
  5.  
  6. <style type="text/css">
  7. #cuestionario {
  8.     padding:10px;
  9.     margin:0px;
  10.     list-style:none;
  11. }
  12. #cuestionario dd {
  13.     display:block;
  14.     height:18px;
  15.     text-decoration:none;
  16.     color:#666666 !important;
  17.     padding:1px 5px 1px 5px;
  18.     border:1px solid #ffffff;
  19. }
  20. #cuestionario dd:hover {
  21.     border:1px solid #e53500;
  22.     text-decoration:none;
  23.     cursor:pointer;
  24. }
  25. .activo{
  26.     background:red;
  27.     font-weight:bold;
  28.     color:#fff;
  29. }
  30. #next{ width:100px; border:solid 1px #CCC; text-align:center; display:none;}
  31. #next:hover{ background:#009; color:#FFF; cursor:pointer;}
  32.  
  33. <script src="jquery.js" type="text/javascript"></script>
  34. <script type="text/javascript">
  35. $(document).ready(function() {
  36.     var question = 0;//VARIABLE QUE NOS INDICA POR QUE PREGUNTA VAMOS
  37.    
  38.     function loadQuestion(){//CARGA LA SIGUIENTE PREGUNTA
  39.         $('#cuestionario').html('').load('preguntas.php?q='+(++question));
  40.     }
  41.  
  42.     $('a.empezar_quiz').click(function() {//EMPEZAR EL QUIZ
  43.         loadQuestion();//CARGAMOS PREGUNTAS
  44.         $(this).hide();//OCULTAMOS LINK
  45.         $('#next').show();//MOSTRAMOS BOTON CONTINUAR
  46.     });
  47.    
  48.     $('#next').click(function(){//ACCION DEL BOTON CONTINUAR
  49.         if(getN() == $('.activo').length){//SI SE HAN SELECCIONADO LAS RESPUESTAS NECESARIAS
  50.             var val = $('#answers').val();
  51.             val = (val != '')?val+'|':val;
  52.            
  53.             var respuestas = '';
  54.             $('.activo').each(function(i){
  55.                 respuestas += $(this).attr('id').split('-')[1];
  56.                 if(i!= ($('.activo').length-1))
  57.                     respuestas+=',';
  58.             });
  59.            
  60.             val += getPregunta()+':'+respuestas;
  61.             $('#answers').val(val);
  62.             loadQuestion();
  63.         }else{//SI NO ENVIAMOS UN MENSAJE DE ALERTA
  64.             var n = getN();
  65.             var text = (n > 1)?' preguntas':' pregunta';
  66.             alert('Debe seleccionar '+getN()+text);
  67.         }
  68.     });
  69.        
  70.     function getN(){//OBTENER EL NUMERO DE RESPUESTAS QUE SE PUEDEN SELECCIONAR
  71.         return $("#cuestionario dl").attr('class').split('n')[1].split(']')[0].split('[')[1];
  72.     }
  73.    
  74.     function getPregunta(){//OBTENER EL NUMERO DE LA PREGUNTA ACTUAL
  75.         return $("#cuestionario dl").attr('id').split('-')[1];
  76.     }
  77.    
  78.     $("#cuestionario dl dd").live('click', function () {//ACCION DE LAS RESPUESTAS
  79.         if($(this).hasClass('activo') || $('.activo').length < getN()){
  80.             $(this).toggleClass('activo');
  81.         }
  82.    });
  83. });
  84.  
  85. </head>
  86. <a class="empezar_quiz" href="#"> Empezar con las preguntas</a>
  87.  
  88. <!-- Carga las preguntas y respuestas -->
  89. <div id="cuestionario"></div>
  90.  
  91. <!-- Aqui se guardaran las respuestas -->
  92. <input id="answers" name="answers" type="hidden" value="" />
  93.  
  94. <div id="next">Continuar</div>
  95.  
  96. <!-- DEBUG: muestra las respuestas seleccionadas -->
  97. <span id="debug"></span>
  98.  
  99. </body>
  100. </html>
por que digo que no entendiste del todo el script?, bueno por que si te fijas en el input answers, que es del tipo hidden, se guardan todas las respuestas que fueron elegidas por cada pregunta, y se guardan en este formato.

1:2,3,5|2:3 //ESTO ES POR PONER UN EJEMPLO

cada pregunta esta separada por "|", el numero de la pregunta es el que esta antes del ":" y las respuestas del usuario estan despues del ":", separadas por comas si es que hay mas de una.

si quieres saber que respuesta eligio el usuario, solo tienes que jugar con ese campo y sacar los valores que necesites.
  #7 (permalink)  
Antiguo 06/09/2010, 14:39
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
creo que no has entendido del todo el script que te pase, te explico para que veas.
te coloco los comentarios.



por que digo que no entendiste del todo el script?, bueno por que si te fijas en el input answers, que es del tipo hidden, se guardan todas las respuestas que fueron elegidas por cada pregunta, y se guardan en este formato.

1:2,3,5|2:3 //ESTO ES POR PONER UN EJEMPLO

cada pregunta esta separada por "|", el numero de la pregunta es el que esta antes del ":" y las respuestas del usuario estan despues del ":", separadas por comas si es que hay mas de una.

si quieres saber que respuesta eligio el usuario, solo tienes que jugar con ese campo y sacar los valores que necesites.

Ahora lo he entendido mejor! muchas gracias tredio

Me he dado cuenta que si hago el quiz y luego recargo y lo vuelvo hacer, las respuestas se mantienen en la variable "val", debería limpiarse al cargar la pagina, no?

Ej. después de haber respondido y cargado la pagina, aparece
1:2,5,6|2:4|1:2,3,4|1:1,2,3|2:2

Después de leer nuevamente el código con tus comentarios, veo que la clave está en esta parte :D

val += getPregunta()+':'+respuestas;

Ya que si imprimo, me muestras las respuestas que se seleccionaron
alert(respuestas);

Entonces, esta es la parte que tengo que enviar al servidor cuando solicito la siguiente pregunta. Y ahí es cuando entra la función

function loadQuestion(){//CARGA LA SIGUIENTE PREGUNTA
$('#cuestionario').html('').load('preguntas.php?q= '+(++question));
}

El problema es que no he podido pasarle estos parámetros a esa función, porque el ámbito de la variable respuestas no lo permite... se puede declarar la variable global? para poder intentar algo así...??

function loadQuestion(){//CARGA LA SIGUIENTE PREGUNTA
$('#cuestionario').html('').load('preguntas.php?q= '+(++question)r=+respuestas);
//alert(respuestas);
}

Muchas gracias de antemano!
  #8 (permalink)  
Antiguo 06/09/2010, 16:23
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

bastaria enviarla como parametro de la funcion, podrias hacer algo asi.

Código Javascript:
Ver original
  1. function loadQuestion(respuestas){//CARGA LA SIGUIENTE PREGUNTA
  2.     var r = (respuestas)?'r='+respuestas:'';
  3.     $('#cuestionario').html('').load('preguntas.php?q= '+(++question)+r);
  4. }
  #9 (permalink)  
Antiguo 06/09/2010, 16:36
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
bastaria enviarla como parametro de la funcion, podrias hacer algo asi.

Código Javascript:
Ver original
  1. function loadQuestion(respuestas){//CARGA LA SIGUIENTE PREGUNTA
  2.     var r = (respuestas)?'r='+respuestas:'';
  3.     $('#cuestionario').html('').load('preguntas.php?q= '+(++question)+r);
  4. }
Gracias tredio, estoy haciendo pruebas desde
http://neodani.com/fdw/jquery/quiz/

y es como si la variable r no tuviese valor, he puesto un alert que me debe decir el valor de r y no printa nada :S
Hice lo mismo con respuestas y me printa "undefined"
  #10 (permalink)  
Antiguo 06/09/2010, 16:45
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

debes modificar esta funcion, como te dije la variable se tiene que pasar por parametro, y no lo estas haciendo.

Código Javascript:
Ver original
  1. $('#next').click(function(){//ACCION DEL BOTON CONTINUAR
  2.         if(getN() == $('.activo').length){//SI SE HAN SELECCIONADO LAS RESPUESTAS NECESARIAS
  3.             var val = $('#answers').val();
  4.             val = (val != '')?val+'|':val;
  5.            
  6.             var respuestas = '';
  7.             $('.activo').each(function(i){
  8.                 respuestas += $(this).attr('id').split('-')[1];
  9.                 if(i!= ($('.activo').length-1))
  10.                     respuestas+=',';
  11.             });
  12.            
  13.             val += getPregunta()+':'+respuestas;
  14.             $('#answers').val(val);
  15.             loadQuestion(respuestas);
  16.         }else{//SI NO ENVIAMOS UN MENSAJE DE ALERTA
  17.             var n = getN();
  18.             var text = (n > 1)?' preguntas':' pregunta';
  19.             alert('Debe seleccionar '+getN()+text);
  20.         }
  21.     });

la primera vez no va a tener ninguna valor, por que que respuestas vamos a mandar si no hay preguntar cierto?
  #11 (permalink)  
Antiguo 07/09/2010, 00:08
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
debes modificar esta funcion, como te dije la variable se tiene que pasar por parametro, y no lo estas haciendo.
Pensaba que te referías a esta loadQuestion(respuestas), y como vi que ya se la pasabas por parámetro por eso no me di cuenta :D

Ya se la he agregado a la función que comentas, ahora sí que puedo recibir las variables. Le puse un & para poder recibir dos variables
preguntas.php?q=2&r=1,2,3

http://neodani.com/fdw/jquery/quiz

También implementé que según la respuesta hiciese una pregunta u otra.
Sin embargo me surgen 2 dudas:

La primera es como incorporar un boton con la función de volver a la pregunta anterior, marcando la pregunta que el usuario respondió.

La segunda, también relacionada es como ir almacenando las respuestas, mejor usar una variable de sesión no? Ya que utilizar el campo hidden no es muy correcto si el usuario a recargado la página, porque no se limpia...

Adjunto el fichero preguntas.php

Código PHP:
Ver original
  1. <?php
  2. //EN EL ID DE CADA dl COLOCAMOS q- SEGUIDO POR EL NUMERO DE LA PREGUNTA, ESTO ES PARA SABER EN QUE PREGUNTA VAMOS
  3. //CADA RESPUESTA SERA ALGO PARECIDO, TENDRA UN ID r- SEGUIDO POR EL NUMERO DE LA RESPUESTA
  4. //LA CLASE QUE TIENE EL dl, SERA PARA INDICAR CUANTAS PREGUNTAS DEBEN SER SELECCIONADAS ANTES DE CONTINUAR
  5.  
  6. $num_pregunta=$_REQUEST['q']; // Recoge el número de la pregunta
  7. $mis_respuestas=array(); // Array donde se van guardando todas las respuestas que contesta el usuario
  8.  
  9. $mis_respuestas[$num_pregunta]=$_REQUEST['r'];
  10.  
  11. if ($_GET['q']==1){?>
  12. <dl id="q-1" class="n[3]">
  13.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Selecciona 3 colores:</b></dt>
  14.     <dd id="r-1">Rojo</dd>
  15.     <dd id="r-2">Verde</dd>
  16.     <dd id="r-3">Azul</dd>
  17.     <dd id="r-4">Amarillo</dd>
  18.     <dd id="r-5">Negro</dd>
  19.     <dd id="r-6">Naranja</dd>
  20. </dl>
  21.  
  22. <?php }elseif($_GET['q']==2) {?>
  23. <dl id="q-2" class="n[1]">
  24.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Qué lenguaje de programacion te gusta mas?</b></dt>
  25.     <dd id="r-1">JAVA</dd>
  26.     <dd id="r-2">PHP</dd>
  27.     <dd id="r-3">ASP</dd>
  28.     <dd id="r-4">C</dd>
  29. </dl>
  30. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  31.  
  32. <?php
  33. // En funcion de las respuestas anteriores se formula la siguiente pregunta...
  34. }elseif(($_GET['q']==3)&&(($_GET['r']==1)||($_GET['r']==2))) {?>
  35. <dl id="q-3" class="n[1]">
  36.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Relacionada con PHP y JAVA </b></dt>
  37.     <dd id="r-1">respuesta 1</dd>
  38.     <dd id="r-2">respuesta 2</dd>
  39.     <dd id="r-3">respuesta 3</dd>
  40.     <dd id="r-4">respuesta 4</dd>
  41. </dl>
  42. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  43.  
  44. <?php }elseif(($_GET['q']==3)&&(($_GET['r']==3)||($_GET['r']==4))) {?>
  45. <dl id="q-3" class="n[1]">
  46.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Relacionada con ASP y C >> </b></dt>
  47.     <dd id="r-1">respuesta 1</dd>
  48.     <dd id="r-2">respuesta 2</dd>
  49.     <dd id="r-3">respuesta 3</dd>
  50.     <dd id="r-4">respuesta 4</dd>
  51. </dl>
  52. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  53.  
  54. <?php }elseif($_GET['q']==4) {?>
  55. <dl id="q-4" class="n[1]">
  56.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Cuál es tu edad?</b></dt>
  57.     <dd id="r-1">menos de 18</dd>
  58.     <dd id="r-2">18-25</dd>
  59.     <dd id="r-3">26-40</dd>
  60.     <dd id="r-4">mas de 40</dd>
  61. </dl>
  62. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  63. <?php }?>


Muchas gracias de antemano
  #12 (permalink)  
Antiguo 07/09/2010, 12:24
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

sobre la segunda pregunta no te entiendo, que dices que el campo hidden no se borra al actualizar la pagina?, pues eso es exactamente lo que deberia de hacer, si no se te borra no tengo idea de por que esta pasando eso.

sobre la segunda aca te hice algo, pero el script se complico mas, mientras mas le quieras poner mas complicado se pone, aca te dejo lo que hice.

Código Javascript:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/v1.98/DTD/v1.98-strict.dtd">
  2. <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en"><head>
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. <title>Ejemplo de encuesta inteligente</title>
  5.  
  6. <style type="text/css">
  7. #cuestionario {
  8.     padding:10px;
  9.     margin:0px;
  10.     list-style:none;
  11. }
  12. #cuestionario dd {
  13.     display:block;
  14.     height:18px;
  15.     text-decoration:none;
  16.     color:#666666 !important;
  17.     padding:1px 5px 1px 5px;
  18.     border:1px solid #ffffff;
  19. }
  20. #cuestionario dd:hover {
  21.     border:1px solid #e53500;
  22.     text-decoration:none;
  23.     cursor:pointer;
  24. }
  25. .activo{
  26.     background:red;
  27.     font-weight:bold;
  28.     color:#fff;
  29. }
  30. .button{ width:100px; border:solid 1px #CCC; text-align:center; display:none; float:left; margin-right:20px;}
  31. .button:hover{ background:#009; color:#FFF; cursor:pointer;}
  32. </style>
  33.  
  34. <script src="jquery.js" type="text/javascript"></script>
  35. <script type="text/javascript">
  36. $(document).ready(function() {
  37.     var question = 1;
  38.    
  39.     function loadQuestion(param){//CARGA LA SIGUIENTE PREGUNTA
  40.         var r = (param)?(param.respuestas)?'&r='+param.respuestas:'':'';
  41.         $('#cuestionario').html('').load('preguntas.php?q='+(question)+r,(param)?param.callback:null);
  42.     }
  43.    
  44.     function getRespuestas(){
  45.         var respuestas = '';
  46.         $('.activo').each(function(i){//OBTENEMOS LAS RESPUESTAS SELECCIONADAS
  47.             respuestas += $(this).attr('id').split('-')[1];
  48.             if(i!= ($('.activo').length-1))
  49.                 respuestas+=',';
  50.         });
  51.         return respuestas;
  52.     }
  53.    
  54.     function seleccionarRespuestas(){
  55.         var pregunta = getPregunta();
  56.         var val = ($('#answers').val() == '')?'':$('#answers').val()+'|';
  57.        
  58.         var respuestas = getRespuestas();
  59.        
  60.         if(val.indexOf('R['+pregunta+']') != -1){//SI YA SE HAN SELECCIONADO RESPUESTAS PREVIAMENTE PARA ESA PREGUNTA
  61.             var p = val.split('|')[parseInt(pregunta)-1];
  62.             var p2 = p.split(':')[0]+':'+respuestas;
  63.             val = val.replace(p,p2);
  64.         }else{
  65.             val += 'R['+pregunta+']:'+respuestas;
  66.         }
  67.         return {val:val,respuestas:respuestas};
  68.     }
  69.    
  70.     function marcarElegidas(){
  71.         var respuestas = $('#answers').val().split('|')[parseInt(getPregunta())-1].split(':')[1].split(',');//OBTENEMOS LAS RESPUESTAS SELECCIONADAS DE LA PREGUNTA
  72.         for(var i=0;i<respuestas.length;i++){
  73.             $('#r-'+respuestas[i]).addClass('activo');
  74.         }
  75.     }
  76.  
  77.     $('a.empezar_quiz').click(function() {
  78.         loadQuestion()
  79.         $(this).hide();
  80.         $('.button').show();       
  81.     });
  82.    
  83.     $('#next').click(function(){
  84.         if(getN() == $('.activo').length){     
  85.             var r =     seleccionarRespuestas();
  86.             $('#answers').val(r.val);
  87.             question++;
  88.             loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});   
  89.         }else{
  90.             var n = getN();
  91.             var text = (n > 1)?' preguntas':' pregunta';
  92.             alert('Debe seleccionar '+getN()+text);
  93.         }
  94.     });
  95.    
  96.     $('#prev').click(function(){
  97.         if(getPregunta() != 1){
  98.             if(getN() == $('.activo').length){             
  99.                 var r =     seleccionarRespuestas();
  100.                 $('#answers').val(r.val);
  101.                 question--;
  102.                 loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});               
  103.             }else{
  104.                 var n = getN();
  105.                 var text = (n > 1)?' preguntas':' pregunta';
  106.                 alert('Debe seleccionar '+getN()+text);
  107.             }
  108.         }else if(getPregunta() == 1){
  109.             alert('Ya se encuentra en la primera pregunta.')
  110.         }
  111.     });
  112.        
  113.     function getN(){
  114.         return $("#cuestionario dl").attr('class').split('n')[1].split(']')[0].split('[')[1];
  115.     }
  116.    
  117.     function getPregunta(){
  118.         return $("#cuestionario dl").attr('id').split('-')[1];
  119.     }
  120.    
  121.     $("#cuestionario dl dd").live('click', function () {
  122.         if($(this).hasClass('activo') || $('.activo').length < getN()){
  123.             $(this).toggleClass('activo');
  124.             //$("#debug").text("Hay " + $('.activo').length + " elementos seleccionados");
  125.         }
  126.     });
  127.    
  128.     // Una vez empieza el test el boton empezar debe desaparecer
  129.     //$('a.empezar_quiz').hide();
  130. });
  131. </script>
  132.  
  133. </head>
  134. <body>
  135. <a class="empezar_quiz" href="#"> Empezar con las preguntas</a>
  136.  
  137. <!-- Carga las preguntas y respuestas -->
  138. <div id="cuestionario"></div>
  139.  
  140. <!-- Aqui se guardaran las respuestas -->
  141. <input id="answers" name="answers" type="hidden" value="" />
  142.  
  143. <div id="prev" class="button">Anterior</div>
  144. <div id="next" class="button">Continuar</div>
  145.  
  146. <!-- DEBUG: muestra las respuestas seleccionadas -->
  147. <span id="debug"></span>
  148.  
  149. </body>
  150. </html>
  #13 (permalink)  
Antiguo 07/09/2010, 14:44
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
sobre la segunda pregunta no te entiendo, que dices que el campo hidden no se borra al actualizar la pagina?, pues eso es exactamente lo que deberia de hacer, si no se te borra no tengo idea de por que esta pasando eso.

sobre la segunda aca te hice algo, pero el script se complico mas, mientras mas le quieras poner mas complicado se pone, aca te dejo lo que hice.
Si que empieza a complicarse, lo he subido online
http://neodani.com/fdw/jquery/quiz/

Te agradezco el tiempo que estas dedicando tredio

He visto que el botón anterior aparece en la primera pregunta, aunque tiene puesto el aviso de que estás en la primera pregunta, no sería mas cómodo que en la primera pregunta no apareciese?

Y otra cosa que veo es que cuando pasas la primera pregunta, cuando intentas volver para atrás te obliga a marcar una respuesta antes, esto imagino que está entrando en conflicto con la validación del if no?

Código Javascript:
Ver original
  1. $('#prev').click(function(){
  2.         if(getPregunta() != 1){
  3.             if(getN() == $('.activo').length){              
  4.                 var r =     seleccionarRespuestas();
  5.                 $('#answers').val(r.val);
  6.                 question--;
  7.                 loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});                
  8.             }else{
  9.                 var n = getN();
  10.                 var text = (n > 1)?' preguntas':' pregunta';
  11.                 alert('Debe seleccionar '+getN()+text);
  12.             }
  13.         }else if(getPregunta() == 1){
  14.             alert('Ya se encuentra en la primera pregunta.')
  15.         }
  16.     });

Tampoco sé porque cuando abro el firebug la consola me muestra un error cuando avanzo de pregunta

$(
[Break on this error] var respuestas = $('#answers')...PUESTAS SELECCIONADAS DE LA PREGUNTA
linea 71


Puedes ver el error, te sale??

Mil gracias nuevamente
  #14 (permalink)  
Antiguo 07/09/2010, 15:38
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

bueno lo de borrar el boton en la primera pregunta no me parece dificil pienso que lo puedes hacer tu sin mucho problema, lo de marcar las preguntas al continuar o volver lo hice aproposito, no se me parecio mejor asi, pero tambien lo puedes cambiar como mas te guste. Lo del error se soluciona cambiando esta funcion

Código Javascript:
Ver original
  1. function marcarElegidas(){
  2.         var respuestas = ($('#answers').val().split('|').length == 1)?'':$('#answers').val().split('|')[parseInt(getPregunta())-1].split(':')[1].split(',');//OBTENEMOS LAS RESPUESTAS SELECCIONADAS DE LA PREGUNTA
  3.         for(var i=0;i<respuestas.length;i++){
  4.             $('#r-'+respuestas[i]).addClass('activo');
  5.         }
  6.     }
  #15 (permalink)  
Antiguo 07/09/2010, 16:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
bueno lo de borrar el boton en la primera pregunta no me parece dificil pienso que lo puedes hacer tu sin mucho problema, lo de marcar las preguntas al continuar o volver lo hice aproposito, no se me parecio mejor asi, pero tambien lo puedes cambiar como mas te guste. Lo del error se soluciona cambiando esta funcion

Código Javascript:
Ver original
  1. function marcarElegidas(){
  2.         var respuestas = ($('#answers').val().split('|').length == 1)?'':$('#answers').val().split('|')[parseInt(getPregunta())-1].split(':')[1].split(',');//OBTENEMOS LAS RESPUESTAS SELECCIONADAS DE LA PREGUNTA
  3.         for(var i=0;i<respuestas.length;i++){
  4.             $('#r-'+respuestas[i]).addClass('activo');
  5.         }
  6.     }
He intentado cambiar la funcionalidad del boton atras, y no sé porque cuando el id de la pregunta no es 1, no me muestra el boton atras.

He cambiado el css para diferenciar boton de otro, aunque ambos tienen las mismas propiedades

#next.button,#prev.button{ width:100px; border:solid 1px #CCC; text-align:center; display:none; float:left; margin-right:20px;}
#next.button:hover,#prev.button:hover{ background:#009; color:#FFF; cursor:pointer;}

Y he modificado las dos funciones 3 funciones (tienen un comentario las lineas que he modificado)

Código Javascript:
Ver original
  1. $('a.empezar_quiz').click(function() {
  2.         loadQuestion()
  3.         $(this).hide();
  4.         $('#next.button').show(); // muestro del boton continuar      
  5.     });
  6.    
  7.     $('#next').click(function(){
  8.         if(getN() == $('.activo').length){      
  9.             var r =     seleccionarRespuestas();
  10.             $('#answers').val(r.val);
  11.             question++;
  12.             loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});    
  13.         }else{
  14.             var n = getN();
  15.             var text = (n > 1)?' preguntas':' pregunta';
  16.             alert('Debe seleccionar '+getN()+text);
  17.         }
  18.         if(getPregunta() != 1){ // si no estamos en la primera pregunta muestro el boton
  19.             $('#prev.button').show();
  20.         }
  21.     });
  22.    
  23.     $('#prev').click(function(){
  24.         if(getPregunta() != 1){
  25.             if(getN() == $('.activo').length){              
  26.                 var r = seleccionarRespuestas();
  27.                 $('#answers').val(r.val);
  28.                 question--;
  29.                 loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});                
  30.             }else{
  31.                 var n = getN();
  32.                 var text = (n > 1)?' preguntas':' pregunta';
  33.                 alert('Debe seleccionar '+getN()+text);
  34.             }
  35.         }else if(getPregunta() == 1){
  36.             //alert('Ya se encuentra en la primera pregunta.')
  37.             $('#prev.button').hide(); // si estoy en la primera pregunta oculto el boton
  38.         }
  39.     });

Puedes verlo en la web http://neodani.com/fdw/jquery/quiz/

También he implementado la corrección, pero ha salido otro error de depuración en esta linea

$("#cuestionario dl").attr("id") is undefined
[Break on this error] return $("#cuestionario dl").attr('id').split('-')[1];
linea 124


Gracias de antemano :)
  #16 (permalink)  
Antiguo 07/09/2010, 17:36
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

solo basta con modificar esta funcion, pero quita los demas cambios que hiciste, excepto $('a.empezar_quiz').click().

Código Javascript:
Ver original
  1. function loadQuestion(param){//CARGA LA SIGUIENTE PREGUNTA
  2.         if(question == 1){$('#prev').hide();}else{$('#prev').show();}
  3.         var r = (param)?(param.respuestas)?'&r='+param.respuestas:'':'';
  4.         $('#cuestionario').html('').load('preguntas.php?q='+(question)+r,(param)?param.callback:null);
  5.     }

el segundo error sucede cuando llegas a una pregunta que no existe, es decir, cuando no hay preguntas en pantalla, eso es algo que deberias de evitar( dejar la pantalla en blanco ), lo podrias hacer definiendo un numero maximo de preguntas, y cuando llegues a ese numero y le das continuar guardas todas las respuestas del usuario.
  #17 (permalink)  
Antiguo 07/09/2010, 23:59
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
solo basta con modificar esta funcion, pero quita los demas cambios que hiciste, excepto $('a.empezar_quiz').click().

Código Javascript:
Ver original
  1. function loadQuestion(param){//CARGA LA SIGUIENTE PREGUNTA
  2.         if(question == 1){$('#prev').hide();}else{$('#prev').show();}
  3.         var r = (param)?(param.respuestas)?'&r='+param.respuestas:'':'';
  4.         $('#cuestionario').html('').load('preguntas.php?q='+(question)+r,(param)?param.callback:null);
  5.     }

el segundo error sucede cuando llegas a una pregunta que no existe, es decir, cuando no hay preguntas en pantalla, eso es algo que deberias de evitar( dejar la pantalla en blanco ), lo podrias hacer definiendo un numero maximo de preguntas, y cuando llegues a ese numero y le das continuar guardas todas las respuestas del usuario.
Buenas tredio,

El botón atrás lo que es su aparición funciona correctamente :). Sin embargo, no está haciendo bien su papel. He intentado evitar que se tenga que marcar una opción para poder retroceder y lo he dejado así, una parte funciona:

Código Javascript:
Ver original
  1. $('#prev').click(function(){
  2.         if(getPregunta() != 1){
  3.             //if(getN() == $('.activo').length){              
  4.                 var r = seleccionarRespuestas();
  5.                 $('#answers').val(r.val);
  6.                 question--;
  7.                 loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});                
  8.             /*}else{
  9.                 var n = getN();
  10.                 var text = (n > 1)?' preguntas':' pregunta';
  11.                 alert('Debe seleccionar '+getN()+text);
  12.             }*/
  13.         }/*else if(getPregunta() == 1){
  14.             alert('Ya se encuentra en la primera pregunta.')
  15.         }*/
  16.     });

Por ejemplo, si vas de la primera pregunta a la segunda y viceversa, sin seleccionar nada en la segunda, funciona bien. Pero a la que avanzas hasta la tercera pregunta, y vuelves para atrás hasta la primera, desaparecen las respuestas de la primera pregunta :S

Y sobre el error de depuración, no es que no exista la pregunta porque existe. Si pasas de la pregunta 2 a la pregunta 3 me aparece el error que te comentaba en el otro post, a ti no?

Puedes probarlo desde la web http://neodani.com/fdw/jquery/quiz/

Muchas gracias de antemano!
  #18 (permalink)  
Antiguo 13/09/2010, 21:48
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

es decir, no quieres que se tenga que marcar cuando se vaya para atras?, sabes lo hice asi (que se tenga que marcar) por que te evitas algunos problemas.
  #19 (permalink)  
Antiguo 13/09/2010, 23:46
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
es decir, no quieres que se tenga que marcar cuando se vaya para atras?, sabes lo hice asi (que se tenga que marcar) por que te evitas algunos problemas.
Exacto que sea necesario marcar. Si te fijas funciona a medias, no se que pasa que si avanzas hasta la pregunta 3, vuelves a la 1, avanzas hasta la 3 y vuelves a la 1 veras que se han perdido preguntas....

Tampoco consigo eliminar el error de depuración en la consola del firebug, no se si tiene algo que ver con su comportamiento extraño...

$(var respuestas = ($('#answers'...SPUESTAS SELECCIONADAS DE LA PREGUNTA
# (línea 74)
  #20 (permalink)  
Antiguo 14/09/2010, 11:56
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

mm, bueno yo voy hasta la 3 me regreso voy de nuevo me vuelvo a regresar y no veo problema alguno, las preguntas siguen marcadas.
  #21 (permalink)  
Antiguo 14/09/2010, 16:14
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
mm, bueno yo voy hasta la 3 me regreso voy de nuevo me vuelvo a regresar y no veo problema alguno, las preguntas siguen marcadas.
Es raro, lo he repetido varias veces nuevamente y sí, ahora funciona sin tocar nada raaaaaaaaro...

Sin embargo, si voy hasta la pregunta 4 (que existe, Pregunta 4 : ¿Cuál es tu edad?) luego no puedo volver para atrás si no marco ninguna respuesta.

En cambio, si marco alguna respuesta de la pregunta 4, si que me deja volver para atrás.

¿Te pasa lo mismo?

También si he realizado la encuesta previamente y recargo la página me sale el botón "empezar con las preguntas", pulso y me aparece la primera pregunta sin ninguna respuesta marcada, bien. Pero si respondo y avanzo hasta la segunda pregunta me detecta el valor guardado de la anterior encuesta. ¿A ti no?

Muchas gracias de antemano!
  #22 (permalink)  
Antiguo 14/09/2010, 16:20
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

bueno a mi en particular al llegar a una pregunta mayor a la tercera y devolverme, no pasa nada, es decir, no me muestra ninguna pregunta ni ninguna respuesta. y no al recargar la pagina todo queda bien, que navegador estas usando?
  #23 (permalink)  
Antiguo 14/09/2010, 23:46
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
bueno a mi en particular al llegar a una pregunta mayor a la tercera y devolverme, no pasa nada, es decir, no me muestra ninguna pregunta ni ninguna respuesta. y no al recargar la pagina todo queda bien, que navegador estas usando?
No llegas a ver la pregunta 4 que dice
Pregunta 4 : ¿Cuál es tu edad?

Uso el navegador Firefox 3.6.9 y el IE 8, cual usas tu?

Y a mi muestra 4 preguntas, ¿lo estás probando desde la web?
http://neodani.com/fdw/jquery/quiz/

El fichero de preguntas es el siguiente, si que hay 4 pregunta...

Código PHP:
Ver original
  1. <?php
  2. //EN EL ID DE CADA dl COLOCAMOS q- SEGUIDO POR EL NUMERO DE LA PREGUNTA, ESTO ES PARA SABER EN QUE PREGUNTA VAMOS
  3. //CADA RESPUESTA SERA ALGO PARECIDO, TENDRA UN ID r- SEGUIDO POR EL NUMERO DE LA RESPUESTA
  4. //LA CLASE QUE TIENE EL dl, SERA PARA INDICAR CUANTAS PREGUNTAS DEBEN SER SELECCIONADAS ANTES DE CONTINUAR
  5.  
  6. $num_pregunta=$_REQUEST['q']; // Recoge el número de la pregunta
  7. $mis_respuestas=array(); // Array donde se van guardando todas las respuestas que contesta el usuario
  8.  
  9. $mis_respuestas[$num_pregunta]=$_REQUEST['r'];
  10.  
  11. if ($_GET['q']==1){?>
  12. <dl id="q-1" class="n[3]">
  13.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Selecciona 3 colores:</b></dt>
  14.     <dd id="r-1">Rojo</dd>
  15.     <dd id="r-2">Verde</dd>
  16.     <dd id="r-3">Azul</dd>
  17.     <dd id="r-4">Amarillo</dd>
  18.     <dd id="r-5">Negro</dd>
  19.     <dd id="r-6">Naranja</dd>
  20. </dl>
  21.  
  22. <?php }elseif($_GET['q']==2) {?>
  23. <dl id="q-2" class="n[1]">
  24.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Qué lenguaje de programacion te gusta mas?</b></dt>
  25.     <dd id="r-1">JAVA</dd>
  26.     <dd id="r-2">PHP</dd>
  27.     <dd id="r-3">ASP</dd>
  28.     <dd id="r-4">C</dd>
  29. </dl>
  30. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  31.  
  32. <?php
  33. // En funcion de las respuestas anteriores se formula la siguiente pregunta...
  34. }elseif(($_GET['q']==3)&&(($_GET['r']==1)||($_GET['r']==2))) {?>
  35. <dl id="q-3" class="n[1]">
  36.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Relacionada con PHP y JAVA </b></dt>
  37.     <dd id="r-1">respuesta 1</dd>
  38.     <dd id="r-2">respuesta 2</dd>
  39.     <dd id="r-3">respuesta 3</dd>
  40.     <dd id="r-4">respuesta 4</dd>
  41. </dl>
  42. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  43.  
  44. <?php }elseif(($_GET['q']==3)&&(($_GET['r']==3)||($_GET['r']==4))) {?>
  45. <dl id="q-3" class="n[1]">
  46.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Relacionada con ASP y C >> </b></dt>
  47.     <dd id="r-1">respuesta 1</dd>
  48.     <dd id="r-2">respuesta 2</dd>
  49.     <dd id="r-3">respuesta 3</dd>
  50.     <dd id="r-4">respuesta 4</dd>
  51. </dl>
  52. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  53.  
  54. <?php }elseif($_GET['q']==4) {?>
  55. <dl id="q-4" class="n[1]">
  56.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Cuál es tu edad?</b></dt>
  57.     <dd id="r-1">menos de 18</dd>
  58.     <dd id="r-2">18-25</dd>
  59.     <dd id="r-3">26-40</dd>
  60.     <dd id="r-4">mas de 40</dd>
  61. </dl>
  62. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$mis_respuestas[$num_pregunta]?></p>
  63. <?php }?>

Muchas gracias de antemano!
  #24 (permalink)  
Antiguo 15/09/2010, 09:51
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

si si la veo, lo que te digo es que cuando llego a cualquier pregunta mayor o igual a la tercera y me trato de devolver no me muestra ninguna pregunta, si me entiendes?
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D
  #25 (permalink)  
Antiguo 15/09/2010, 11:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
si si la veo, lo que te digo es que cuando llego a cualquier pregunta mayor o igual a la tercera y me trato de devolver no me muestra ninguna pregunta, si me entiendes?
La pregunta que me hago es... por qué no puedes retroceder hacia atrás una vez llegas a la pregunta 4? sabes que es lo que impide este comportamiento?
  #26 (permalink)  
Antiguo 15/09/2010, 11:51
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

si en realidad si se, sabes que desde la tercera pregunta empiezas a enviar parametros para ver cual pregunta vas a mostrar, de la forma en que esta hecho ahorita al retroceder no envia esos parametros y eso es lo que esta causando que no se muestre nada
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D
  #27 (permalink)  
Antiguo 15/09/2010, 14:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
si en realidad si se, sabes que desde la tercera pregunta empiezas a enviar parametros para ver cual pregunta vas a mostrar, de la forma en que esta hecho ahorita al retroceder no envia esos parametros y eso es lo que esta causando que no se muestre nada
Así que es culpa de esa parte... entonces que debo hacer? modificar el archivo de las preguntas o el javascript que controla la marcha atras...


Código Javascript:
Ver original
  1. $('#prev').click(function(){
  2.         if(getPregunta() != 1){
  3.             //if(getN() == $('.activo').length){              
  4.                 var r = seleccionarRespuestas();
  5.                 $('#answers').val(r.val);
  6.                 question--;
  7.                 loadQuestion({respuestas:r.respuestas,callback:marcarElegidas});                
  8.             /*}else{
  9.                 var n = getN();
  10.                 var text = (n > 1)?' preguntas':' pregunta';
  11.                 alert('Debe seleccionar '+getN()+text);
  12.             }*/
  13.         }/*else if(getPregunta() == 1){
  14.             alert('Ya se encuentra en la primera pregunta.')
  15.         }*/
  16.     });

He estado mirando y no veo por donde empezar a meterle mano.

Te agradecería mucho si me pudiese echar una mano :)
  #28 (permalink)  
Antiguo 15/09/2010, 17:11
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

si dejaras el script como te lo puse originalmente no habria problemas, como te dije antes creo que es mejor que se haya seleccionado una pregunta antes de volver.

por que no te gusta de esa manera?
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D
  #29 (permalink)  
Antiguo 16/09/2010, 00:20
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Cita:
Iniciado por tredio Ver Mensaje
si dejaras el script como te lo puse originalmente no habria problemas, como te dije antes creo que es mejor que se haya seleccionado una pregunta antes de volver.

por que no te gusta de esa manera?
Lo he modificado, ahora necesitas marcar una opción. De esta forma no veo que falle ;)
Si es muy complicado hacerlo de la otra forma lo dejaré así.

¿Sabes cómo agregar un botón en la última pregunta "FINALIZAR" ?
Si las preguntas fuesen fijas y tuviesen un número limitado de 10 preguntas y siempre fuesen 10, sería facil... pero al variar el número de preguntas según el camino que tomes, cómo lo haces?

Y otra pregunta, cómo guardarías las respuestas que se han ido marcando, para luego disponer de todas ellas cuando el usuario pulse sobre el botón FINALIZAR? utilizas alguna variable de sesión?

Lo he intentado así, pero no la guarda

Código PHP:
Ver original
  1. <?php
  2. //EN EL ID DE CADA dl COLOCAMOS q- SEGUIDO POR EL NUMERO DE LA PREGUNTA, ESTO ES PARA SABER EN QUE PREGUNTA VAMOS
  3. //CADA RESPUESTA SERA ALGO PARECIDO, TENDRA UN ID r- SEGUIDO POR EL NUMERO DE LA RESPUESTA
  4. //LA CLASE QUE TIENE EL dl, SERA PARA INDICAR CUANTAS PREGUNTAS DEBEN SER SELECCIONADAS ANTES DE CONTINUAR
  5.  
  6. $num_pregunta=$_REQUEST['q']; // Recoge el número de la pregunta
  7. $mis_respuestas=array();
  8. $mis_respuestas[$num_pregunta]=$_REQUEST['r'];
  9.  
  10. $_SESSION['quiz'][$num_pregunta] = $_REQUEST['r']; // Guardo en la variable de sesión las respuestas
  11.  
  12. if ($_GET['q']==1){?>
  13. <dl id="q-1" class="n[3]">
  14.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>Selecciona 3 colores:</b></dt>
  15.     <dd id="r-1">Rojo</dd>
  16.     <dd id="r-2">Verde</dd>
  17.     <dd id="r-3">Azul</dd>
  18.     <dd id="r-4">Amarillo</dd>
  19.     <dd id="r-5">Negro</dd>
  20.     <dd id="r-6">Naranja</dd>
  21. </dl>
  22.  
  23. <?php }elseif($_GET['q']==2) {?>
  24. <dl id="q-2" class="n[1]">
  25.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Qué lenguaje de programacion te gusta mas?</b></dt>
  26.     <dd id="r-1">JAVA</dd>
  27.     <dd id="r-2">PHP</dd>
  28.     <dd id="r-3">ASP</dd>
  29.     <dd id="r-4">C</dd>
  30. </dl>
  31. <p>DEBUG: Respuestas de la pregunta <? echo ($num_pregunta-1).' : '.$_SESSION['quiz'][$num_pregunta]?></p>

Muchas gracias de antemano!
  #30 (permalink)  
Antiguo 16/09/2010, 09:56
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 16 años
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

el numero de preguntas lo podrias obtener usando un poco de ajax si no quieres recargar la pagina, y lo guardas en una variable, cuando llegues a ese numero de pregunta le cambias el texto del boton continuar a cancelar.

como ya te he dicho antes todas las respuestas estan guardadas en el campo hidden "answers" no se que vas a hacer con esas respuestas despues, me imagino que las guardaras en una base de datos.

lo que puedes hacer es que cuando el boton #next tenga como texto "Finalizar" tambien mandas las respuestas y las guardas.
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D

Etiquetas: inteligente
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:09.