Goedemorgen,

ik heb een probleem met een twee Radiobuttons in een formulier. Ik wil graag dat op de redirect pagina, de score uitslag verschijnt van de gekozen antwoorden. De originele functie werkt met een PHP POST (bron: http://css-tricks.com/building-a-simple-quiz/) maar in combinatie met mijn javascript bestand, krijg ik het niet werkend..

Heeft iemand een oplossing hierop?

Bedankt voor de moeite..

FORMULIER

<form id="ContactForm" action="">

<section class="st-panel" id="st-panel-2">
						<div class="st-deco"></div>
                            <h2>Toelichting:<br />Neem plaats op de eerste tegel en wek energie op. Zodra de vraag op het scherm verschijnt, kiest u één van de vier volgende antwoorden.</h2>
                                <div class="sizer">
                                    <label class="label_radio" for="vraag1_A"><input name="vraag1_antwoorden" id="vraag1_A" value="A" type="radio" />A) Geen eis</label>
                                    <label class="label_radio" for="vraag1_B"><input name="vraag1_antwoorden" id="vraag1_B" value="B" type="radio" />B) 0,1 Ohm</label>
                                    <label class="label_radio" for="vraag1_C"><input name="vraag1_antwoorden" id="vraag1_C" value="C" type="radio" />C) 1 Ohm</label>
                                    <label class="label_radio" for="vraag1_D"><input name="vraag1_antwoorden" id="vraag1_D" value="D" type="radio" />D) 10 Ohm</label>
                                </div>
                                <span id="vraag1_antwoorden" class="foutmelding_antwoorden" style="display:none;"></span>
					</section>
<input type="button" class="button_verzenden black" id="send" value="VERSTUUR" /><input type="hidden" id="newcontact" name="newcontact" value="1"></input></form>


JAVASCRIPT VOOR VERZENDEN MAIL, DATABASE TOEVOEGING

$(document).ready(function() {
	contact.initEventHandlers();
});
var contact = {
	initEventHandlers	: function() {
		/* clicking the submit form */
		$('#send').bind('click',function(event){
			$('#loader').show();
			setTimeout('contact.ContactFormSubmit()',500);
		});
		/* remove messages when user wants to correct (focus on the input) */
		$('.inplaceError,.foutmelding_antwoorden',$('#ContactForm')).bind('focus',function(){
			var $this 		= $(this);
			var $error_elem = $this.next();
			if($error_elem.length)
				$error_elem.fadeOut(function(){$(this).empty()});
			$('#success_message').empty();	
		});
		/* user presses enter - submits form */
		$('#ContactForm input,#ContactForm textarea').keypress(function (e) {
			if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {  
				$("#send").click();
				return false;  
			} 
			else  
				return true;  
		});
	},
	ContactFormSubmit	: function() {
		$.ajax({
			   type		: 'POST',
			   url		: 'php/contact.php?ts='+new Date().getTime(),
			   dataType	: 'json',
			   data		: $('#ContactForm').serialize(),
			   success	: function(data,textStatus){
							  //hide the ajax loader
							  $('#loader').hide();
							  if(data.result == '1'){
							      //show success message
								$('#midden').remove();
window.location = "result.php"
							  }
							  else if(data.result == '-1'){
                                  for(var i=0; i < data.errors.length; ++i ){
                                      if(data.errors[i].value!='') {
                                        var elm = $("#"+data.errors[i].name);
                                        // we gaan kijken welk soort element elm is.
                                        // wanneer dat element een span is, moeten we geen nieuwe span meer aanmaken...
                                        switch (elm[0].tagName.toLowerCase()) {
                                          case 'span':
                                            elm.html(data.errors[i].value).fadeIn();
                                            break;
                                          default:
                                            elm.next().html('<span class="foutmelding_antwoorden">'+data.errors[i].value+'</span>').fadeIn();
                                            break;
                                        }
                                      }
                                      
                                          $("#"+data.errors[i].name).next().html('<span class="foutmelding_antwoorden">'+data.errors[i].value+'</span>').fadeIn();
                                  }
                              } 					  
						  },
			   error	: function(data,textStatus){}
		});
	}  
};


RESULT PAGINA

<body>
    <div id="begin_framework">
    <strong>Quiz</strong><br /><br />Bedankt voor uw participatie, u kunt hieronder uw score vinden en uw certificaat uitprinten.
    
	<?php
                
        $answer1 = $_POST['vraag1_antwoorden'];
        $answer2 = $_POST['vraag2_antwoorden'];
        
        $totalCorrect = 0;
        
        if ($answer1 == "C") { $totalCorrect++; }
        if ($answer2 == "A") { $totalCorrect++; }
        
        echo "<div id='results'>$totalCorrect / 2 correct</div>";
                
    ?>

    </div>
</body>
De javascript moet in het resultaat van je ajax call. Alleen als de data naar de server is gestuurd, het succesvol is gegaan en je de succesdiv wil tonen haal je de gegevens uit het form en plaats je het in de div.
Oke, dus het script komt zo te staan:


$(document).ready(function() {
	contact.initEventHandlers();
});
var contact = {
	initEventHandlers	: function() {
		/* clicking the submit form */
		$('#send').bind('click',function(event){
			$('#loader').show();
			setTimeout('contact.ContactFormSubmit()',500);
		});
		/* remove messages when user wants to correct (focus on the input) */
		$('.inplaceError,.foutmelding_antwoorden',$('#ContactForm')).bind('focus',function(){
			var $this 		= $(this);
			var $error_elem = $this.next();
			if($error_elem.length)
				$error_elem.fadeOut(function(){$(this).empty()});
			$('#success_message').empty();	
		});
		/* user presses enter - submits form */
		$('#ContactForm input,#ContactForm textarea').keypress(function (e) {
			if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {  
				$("#send").click();
				return false;  
			} 
			else  
				return true;  
		});
	},
	ContactFormSubmit	: function() {
		$.ajax({
			   type		: 'POST',
			   url		: 'php/contact.php?ts='+new Date().getTime(),
			   dataType	: 'json',
			   data		: $('#ContactForm').serialize(),
			   success	: function(data,textStatus){
							  //hide the ajax loader
							  $('#loader').hide();
							  if(data.result == '1'){
							      //show success message
								$('#midden').remove();
								window.location = "result.php"
								var tekst = $('input[name=vraag1_antwoorden]').val();
							  }
							  else if(data.result == '-1'){
                                  for(var i=0; i < data.errors.length; ++i ){
                                      if(data.errors[i].value!='') {
                                        var elm = $("#"+data.errors[i].name);
                                        // we gaan kijken welk soort element elm is.
                                        // wanneer dat element een span is, moeten we geen nieuwe span meer aanmaken...
                                        switch (elm[0].tagName.toLowerCase()) {
                                          case 'span':
                                            elm.html(data.errors[i].value).fadeIn();
                                            break;
                                          default:
                                            elm.next().html('<span class="foutmelding_quiz">'+data.errors[i].value+'</span>').fadeIn();
                                            break;
                                        }
                                      }
                                      
                                          $("#"+data.errors[i].name).next().html('<span class="foutmelding_antwoorden">'+data.errors[i].value+'</span>').fadeIn();
                                  }
                              } 					  
						  },
			   error	: function(data,textStatus){}
		});
	}  
};


Vervolgens de HTML, moet ik daar nog iets met een INPUT TYPE toevoegen?


<form id="ContactForm" action="">
<tr>
<td><div id="succes_div">U koos voor antwoord:<span><span></div><script>$('div#succes_div span').html(tekst);</script></td>
</tr>

</form> 
Geen javascript in je HTML. Niet nodig en gaat waarschijnlijk nog verkeerd ook.

Als ik het goed begrijp is dit het deel van je script na een succesvolle server call:

if(data.result == '1'){
   //show success message
   $('#midden').remove();
   window.location = "result.php"
   var tekst = $('input[name=vraag1_antwoorden]').val();
}

De eerste regel snap ik. De tweede al niet meer.... Daar redirect je de gebruiker namelijk mee naar een andere locatie. Dan heeft dat hele succes div gebeuren niet zoveel zin meer.
De derde regel klopt dan wel weer, alleen daarna zou de andere regel moeten komen, waarin je tekst in de span propt. Vervolgens nog de div tonen en het zou moeten kunnen lukken.
Oke, zo ziet mijn AJAX er nu uit:


if(data.result == '1'){
//show success message
$('#midden').remove();
$('#succes_div span').html(tekst);				

}


Moet ondestaande regel dan in CONTACT.PHP ?


var tekst = $('input[name=vraag1_antwoorden]').val(); 


CONTACT.PHP

<?php
require_once("db.php");                    /* Database Class */
require_once('utils/is_email.php');        /* Email Validation Script */

/* Handle Ajax Request */
if(isset($_POST['newcontact'])){
    $contact = new Contact();
    unset($contact);
}
else{
    header('Location: /');
}

/* Class Contact */
class Contact{
    
    private $db;                         /* the database obj */
    
    private $errors         = array();  /* holds error messages */
    private $num_errors;                   /* number of errors in submitted form */
    
    public function __construct(){
        $this->db = new DB();
        if(isset($_POST['newcontact']))
            $this->processNewMessage();
        else
            header("Location: /");
    }

    public function processNewMessage(){
        
        $contactpersoon        = $_POST['contactpersoon'];        
        $bedrijfsnaam        = $_POST['bedrijfsnaam'];
        $telefoon            = $_POST['telefoon'];
        $email                = $_POST['email'];
        $vraag1_antwoorden    = $_POST['vraag1_antwoorden'];
        $vraag2_antwoorden    = $_POST['vraag2_antwoorden'];
        
            
        /* Server Side Data Validation */
        
        /* Contactpersoon Validation */
        if(!$contactpersoon || mb_strlen($contactpersoon = trim($contactpersoon)) == 0)
            $this->setError('contactpersoon', 'Vul uw contactpersoon in');
        else if(mb_strlen(trim($contactpersoon)) > 120)
            $this->setError('contactpersoon', 'Te lang! 120 karakters max.');
                
        /* Bedrijfsnaam Validation */
            if(!$bedrijfsnaam || mb_strlen($bedrijfsnaam = trim($bedrijfsnaam)) == 0)
            $this->setError('bedrijfsnaam', 'Vul uw bedrijfsnaam in');
        else if(mb_strlen(trim($bedrijfsnaam)) > 120)
            $this->setError('bedrijfsnaam', 'Te lang! 120 karakters max.');
            
            /* Telefoon Validation */
            if(!$telefoon || mb_strlen($telefoon = trim($telefoon)) == 0)
            $this->setError('telefoon', 'Vul uw telefoonnummer in');
        else if(mb_strlen(trim($telefoon)) > 120)
            $this->setError('telefoon', 'Te lang! 120 karakters max.');
            
            /* Vraag 1 Validation */
            if(!$vraag1_antwoorden || mb_strlen($vraag1_antwoorden = trim($vraag1_antwoorden)) == 0)
            $this->setError('vraag1_antwoorden', 'Selecteer een antwoord a.u.b.');
                
            /* Vraag 2 Validation */
            if(!$vraag2_antwoorden || mb_strlen($vraag2_antwoorden = trim($vraag2_antwoorden)) == 0)
            $this->setError('vraag2_antwoorden', 'Selecteer een antwoord a.u.b.');
                
            /* Email Validation */
        if(!$email || mb_strlen($email = trim($email)) == 0)
            $this->setError('email','Vul uw e-mail in');
        else{
            if(!is_email($email))
                $this->setError('email', 'Vul een correct email adres in');
            else if(mb_strlen($email) > 120)
                $this->setError('email', 'Te lang! 120 karakters max.');
        }
    
        /* Errors exist */
        if($this->countErrors() > 0){
            $json = array(
                'result' => -1,
                'errors' => array(
                                array('name' => 'contactpersoon'    ,'value' => $this->error_value('contactpersoon')),
                                array('name' => 'bedrijfsnaam'    ,'value' => $this->error_value('bedrijfsnaam')),
                                array('name' => 'email'        ,'value' => $this->error_value('email')),                                
                                array('name' => 'telefoon'    ,'value' => $this->error_value('telefoon')),
                                array('name' => 'vraag1_antwoorden'    ,'value' => $this->error_value('vraag1_antwoorden')),
                                array('name' => 'vraag2_antwoorden'    ,'value' => $this->error_value('vraag2_antwoorden')),
                            )
                );                
            $encoded = json_encode($json);
            echo $encoded;
            unset($encoded);
        }
        /* No errors, insert in db*/
        else{
            if(($ret = $this->db->dbNewMessage($contactpersoon, $bedrijfsnaam, $email, $telefoon, $vraag1_antwoorden, $vraag2_antwoorden)) > 0){
                $json = array('result'         => 1);
                if(SEND_EMAIL)
                    $this->sendEmail($contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden);
            }    
            else
                $json = array('result'         => -2); /* something went wrong in database insertion  */
            $encoded = json_encode($json);
            echo $encoded;
            unset($encoded);
        }
    }
    
    public function sendEmail($contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden){
        /* Just format the email text the way you want ... */
        $message_body    = "<div style=\"font-size:12px; font-weight:normal;\">Hallo,<br><br>"
                                    ."Het volgende bedrijf heeft zich zojuist aangemeld:</div><br>"
                                    ."<table cellpadding=\"1\" cellspacing=\"1\" width=\"550px\"><tr><td style=\"font-size:12px; color:#000000\">Bedrijfsnaam:</td><td style=\"font-size:12px; color:#000000\">".$bedrijfsnaam."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Contactpersoon:</td><td style=\"font-size:12px; color:#000000\">".$contactpersoon."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Telefoonnummer:</td><td style=\"font-size:12px; color:#000000\">".$telefoon."</td></tr><tr><td style=\"font-size:12px; color:#000000\">E-mail:</td><td style=\"font-size:12px; color:#000000\">".$email."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Antwoord vraag 1:</td><td style=\"font-size:12px; color:#000000\">".$vraag1_antwoorden."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Antwoord vraag 2:</td><td style=\"font-size:12px; color:#000000\">".$vraag2_antwoorden."</td></tr></table><br>";
        
            // Geef GELDIGE adressen op
            // Een korte benaming voor jouw website
            $website_naam = 'Aanmelding';
            // Jouw eigen geldige emailadres
            $eigen_emailadres = 'EMAIL ADRES';
            // Een geldig emailadres voor errors
            $error_emailadres = 'EMAIL ADRES';
            // De naam van de verzender
            $naam_verzender = ''.$bedrijfsnaam.'';
            // Het geldige emailadres van de afzender
            $email_verzender = ''.$email.'';
            // Een geldig emailadres of helemaal leeg laten
            $bcc_emailadres = '';
            // HTML mail? True/False
            $html = true;
            
            // De headers samenstellen
            $headers     = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . PHP_EOL;
            $headers    .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . PHP_EOL;
            $headers    .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . PHP_EOL;
            $headers    .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . PHP_EOL : '';
            $headers    .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
            $headers    .= 'X-Priority: Normal' . PHP_EOL;
            $headers    .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
            $headers    .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL : '';

        
            mail(EMAIL_TO,MESSAGE_SUBJECT,$message_body,$headers);

    }
    
    public function setError($field, $errmsg){
        $this->errors[$field]     = $errmsg;
        $this->num_errors         = count($this->errors);
    }
    
    public function error_value($field){
        if(array_key_exists($field,$this->errors))
            return $this->errors[$field];
        else
            return '';
    }
    
    public function countErrors(){
        return $this->num_errors;
    }
};

?>

Ja, die regel moet natuurlijk nog in dat stuk, anders heeft tekst geen waarde:

if(data.result == '1'){
   //show success message
   $('#midden').remove();
   var tekst = $('input[name=vraag1_antwoorden]').val();
   $('#succes_div span').html(tekst);

   //ook nog nodig om het echt te tonen?
   $('#succes_div').show()
} 

//of korter, maar niet per se duidelijker:
if(data.result == '1'){
   //show success message
   $('#midden').remove();
   $('#succes_div span').html($('input[name=vraag1_antwoorden]').val());
   $('#succes_div').show()
} 
Hee Erwin,

de eerste stap is overwonnen, ik zie data verschijnen.
Alleen het probleem is dat hij de hele tijd antwoord: A laat zien ipv andere antwoord mogelijkheden.

Dit is de eerste vraag:

<div class="sizer">
<label class="label_radio" for="vraag1_A"><input name="vraag1_antwoorden" id="vraag1_A" value="A" type="radio" />A) Geen eis</label>
<label class="label_radio" for="vraag1_B"><input name="vraag1_antwoorden" id="vraag1_B" value="B" type="radio" />B) 0,1 Ohm</label>
<label class="label_radio" for="vraag1_C"><input name="vraag1_antwoorden" id="vraag1_C" value="C" type="radio" />C) 1 Ohm</label>
<label class="label_radio" for="vraag1_D"><input name="vraag1_antwoorden" id="vraag1_D" value="D" type="radio" />D) 10 Ohm</label>
</div>
<span id="vraag1_antwoorden" class="foutmelding_quiz" style="display:none;"></span>


AJAX code huidige situatie:


if(data.result == '1'){
//show success message
								   $('#midden').remove();
var tekst = $('input[name=vraag1_antwoorden]').val();
$('#succes_div span').html(tekst);
								
//ook nog nodig om het echt te tonen?
								   $('#succes_div').show()
}
Is het niet makkelijker dat je vraag en antwoord in een database zet? En dan met een while loop de antwoorden ophaald die aan de vraag_id gekoppeld zijn?

Zo kun je ook makkelijker de resulaten opslaan en opvragen van de deelnemers.
Hee Chris,

Ik ben daar niet zo bekend mee en ik zou het graag in deze situatie willen oplossen. Zie jij een oplossing op bovenstaande post waarin alleen antwoord: A uitgelezen wordt?
Ik denk dat ik iets was vergeten toe te voegen :-)


$('input[name=vraag1_antwoorden]:checked').val()

Zo haal je de checked radio op binnen de groep met radio buttons die dezelfde naam hebben.
...als ik het goed heb, want met deze dingen loop ik altijd te klooien :-)
Probeer het eens.
Haha, we lopen allemaal te klooien hiero :P

Anyway, dit werkt ja, top! Alleen mijn vraag is nu of je daar kan aangeven wat je score is zeg maar op basis van een berekening.

Dus bijvoorbeeld:

U koos voor vraag 1 antwoord: C
U koos voor vraag 2 antwoord: B

(Hier komt dan de score berekening)
Alle antwoorden fout = U heeft score ROOD
1 antwoord goed = U heeft score GEEL
2 antwoorden goed = U heeft score GROEN

Waar zou dat vermeld moeten worden?

Antwoorden HTML

<div id="succes_A_div">U koos voor antwoord: <span><span></div><br />
<div id="succes_B_div">U koos voor antwoord: <span><span></div>


JAVASCRIPT

if(data.result == '1'){
//show success message
								   $('#midden').remove();
var tekst = $('input[name=vraag1_antwoorden]:checked').val();
$('#succes_A_div span').html(tekst);
								   
var tekst = $('input[name=vraag2_antwoorden]:checked').val();
$('#succes_B_div span').html(tekst);
								
//ook nog nodig om het echt te tonen?
								   $('#succes_A_div').show()							$('#succes_B_div').show()
								   
} 

Reageren