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. Muchas gracias por tus comentarios, te respondo Cita: Iniciado por tredio el numero de preguntas lo podrias obtener usando un poco de ajax si no ...

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

Muchas gracias por tus comentarios, te respondo

Cita:
Iniciado por tredio Ver Mensaje
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.
Uhm me interesa esa opción, pero ¿cómo sé yo cuantas preguntas faltan si dependiendo del camino que elija pueden faltar mas o menos?

Cita:
Iniciado por tredio Ver Mensaje
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.
El inconveniente que le veo a coger todas las respuestas del campo hidden "answers" es que a la que navegues un poco adelante y hacia atrás te queda algo así..

:3:3:2,3,4||R[2]:1|||R[3]:1|R[4]:3||||||

Cita:
Iniciado por tredio Ver Mensaje
lo que puedes hacer es que cuando el boton #next tenga como texto "Finalizar" tambien mandas las respuestas y las guardas.
Si las va a enviar mediante el campo hidden answers no lo veo claro... No se pueden ir guardando en una variable de sesión en el script de preguntas.php y así tenerlas disponibles en todo momento?

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

Cita:
Iniciado por neodani Ver Mensaje
Uhm me interesa esa opción, pero ¿cómo sé yo cuantas preguntas faltan si dependiendo del camino que elija pueden faltar mas o menos?
realmente no habia pensado en eso jeje, otra solucion seria colocar una clase a la ultima pregunta que la identifique como tal, algo asi:

Código PHP:
Ver original
  1. <dl id="q-4" class="n[1] ultima">
  2.     <dt>Pregunta <?php echo $num_pregunta ?> : <b>¿Cuál es tu edad?</b></dt>
  3.     <dd id="r-1">menos de 18</dd>
  4.     <dd id="r-2">18-25</dd>
  5.     <dd id="r-3">26-40</dd>
  6.     <dd id="r-4">mas de 40</dd>
  7. </dl>

hacer enfasis en class="n[1] ultima", lo que te quedaria es preguntar si la pregunta tiene la clase ultima si es cierto finalizas el cuestionario. eso lo podrias hacer con la funcion hasClass().


Cita:
Iniciado por neodani Ver Mensaje
El inconveniente que le veo a coger todas las respuestas del campo hidden "answers" es que a la que navegues un poco adelante y hacia atrás te queda algo así..

:3:3:2,3,4||R[2]:1|||R[3]:1|R[4]:3||||||
tienes razon no me habia fijado que pasaba eso, la idea cuando lo hice no fue que quedara asi, hay que arreglar esa parte. eso seria en la funcion seleccionarRespuestas(), hechale un ojo a ver si das con el problema, si no puedes me avisas y yo tambien trato de ver que esta pasando.


Cita:
Iniciado por neodani Ver Mensaje
Si las va a enviar mediante el campo hidden answers no lo veo claro... No se pueden ir guardando en una variable de sesión en el script de preguntas.php y así tenerlas disponibles en todo momento?
de que se puede se puede, pero si ya los datos los tienes a la mano para que hacerlo?, solo hay que arreglar la funcion que te dije arriba y ya no tendrias problemas con agarrar los datos del campo oculto.

saludos
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D

Última edición por tredio; 16/09/2010 a las 16:14
  #33 (permalink)  
Antiguo 18/09/2010, 02:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Buenas,

Estuve probando lo que me dijiste. Agregué la clase ultima en dos preguntas, ahora la secuencia es la siguiente

pregunta 1

pregunta 2
(dependiendo que selecciones se formulará la pregunta 3)

Respuesta 1,2 a la pregunta 2
pregunta 3
pregunta 4
(ultima)
Respuesta 3,4 a la pregunta 2
pregunta 4
(ultima)
Dejo el código que consigo esto

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

Y luego he intentado aplicar el hasClass() pero no me hace caso.

Código Javascript:
Ver original
  1. function loadQuestion(param){//CARGA LA SIGUIENTE PREGUNTA
  2.         if(question == 1){$('#prev').hide();}else{$('#prev').show();} // Esconde el boton atras en la primera pregunta
  3.         if ($('#cuestionario dl').hasClass('ultima')){ //Si detecta que es la ultima pregunta, muestra el boton finalizar en lugar de continuar
  4.             $('#next.button').hide();
  5.             $('#finaliza.button').show();
  6.         }
  7.         var r = (param)?(param.respuestas)?'&r='+param.respuestas:'':'';
  8.         $('#cuestionario').html('').load('preguntas.php?q='+(question)+r,(param)?param.callback:null);
  9.     }

También he intentado ver porque fallaba la seleccionarRespuestas() pero no he sabido por donde meterle mano

¿Puedes ayudarme?

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

aca te arregle, creo que ya anda todo bien.

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

el php es el mismo que me pasaste en el ultimo post
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D
  #35 (permalink)  
Antiguo 18/09/2010, 10:32
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Buenas tredio, de nuevo darte mil gracias por dedicarle el tiempo que le estás dedicando ha ayudarme :)

He subido el fichero al servidor todo genial.

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

He estado haciendo pruebas y si vas por el camino largo (en el que haces mas preguntas), y luego vuelves para atrás y tiras por el el camino corto, el valor hidden de answers conserva todas las preguntas del camino largo...

Entiendo que si el usuario va para atrás y en lugar de elegir ese camino elige otro, en el campo answers, debería estar solo el camino final que ha seguido el usuario, no?

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

uhm no habia pensado en eso, y en realidad tampoco se me ocurre como solucionarlo :S, creo que ya seria cuestion de validarlo cuando finalize la encuesta, por ejemplo, cuando estes guardando las respuestas, tendras que volver a validar, si en la tercera escogio 1 o 2, entonces hago tal cosa, sino hago lo otro. no se si me entendiste.

saludos.
__________________
Extension Google Chrome
dar las gracias no cuesta nada :D
  #37 (permalink)  
Antiguo 02/06/2011, 12:34
 
Fecha de Ingreso: junio-2011
Mensajes: 1
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

Hola por favor tenes el codigo php para darme como ejemplo, gracias.
  #38 (permalink)  
Antiguo 02/06/2011, 12:55
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 15 años, 5 meses
Puntos: 66
Respuesta: Cómo crear una encuesta/quiz inteligente con jquery

bueno realmente yo no lo tengo, a ver si neodani todavia esta por aca y te lo puede facilitar, pero creo que en el mismo post esta el codigo.
__________________
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 13:39.