Check Fragebogen Formular

djstorm

Grünschnabel
Brauche Hilfe bei einem Fragebogen Formular. Die Seite besteht aus mehreren Layern, wobei jeder eine Frage beinhaltet die nur in Erscheinung treten soll, wenn die vorige beantwortet wurde. Meine Frage ist, wenn ich 2 Radio buttons habe, wie schreibe ich in javascript, dass er weiß ob ich zb. Ja oder Nein selektiert habe und dass er dann dementsprechend zu layer 1 oder 2 wechselt bzw diesen sichtbar macht?

Danke schonmal im Vorraus..
 
Hallo,

folgendes Beispiel sollte dir helfen:
PHP:
<html>
<head>
<script language="JavaScript" type="text/javascript">
<!--
function weitermachen(){
  if(document.demo.weiter[0].checked == true){
    document.getElementById('yes').style.display = 'block';          
  }
  else if(document.demo.weiter[1].checked == true){
    document.getElementById('no').style.display = 'block';
  }
  else{
    alert("Auswahl treffen");
  }
}
//-->
</script>

</head>
<body>
<form name="demo">
  <input type="radio" name="weiter" value="ja"> ja<br>
  <input type="radio" name="weiter" value="nein"> nein<br>
  <input type="button" name="weiter" onclick="weitermachen()" value="weiter">
<div id="yes" name="yes" style="display:none;">yes</div>
<div id="no" name="no" style="display:none;">no</div>
</form>
</body>
</html>

bye
 
Danke erstmal für die schnelle Antwort, müsste jetzt auch eigentlich gehen, aber wenn ich ein kästchen angeklickt habe und auf weiter klicke tut sich nix, wobei die fehlermeldung kommt wenn ich nix anklicke. explorer meldet auch keinen script-fehler, wo könnte denn jetzt der fehler liegen? habe auch schon zwei layer zuvor und benutze am anfang momentan also: <Script Language="JavaScript">
Code:
<!--
 function ZeigFrage( layid, cut ) 
 {
	for(var i = 0; i < document.getElementsByTagName("div").length; i++) 
	{
		document.getElementsByTagName("div")[i].style.visibility = "hidden";   
	}
	document.getElementById( layid ).style.visibility = "visible";
	if ( cut == 1) document.getElementById("aktuell").value=layid;
 }

 function ZeigAktuell() 
 {
	var aktlayer;
	for(var i = 0; i < document.getElementsByTagName("div").length; i++) 
	{
		document.getElementsByTagName("div")[i].style.visibility = "hidden";   
	}
	aktlayer=document.getElementById("aktuell").value;
	document.getElementById( aktlayer ).style.visibility = "visible";
 }

function weitermachen(){
  if(document.demo.weiter[0].checked == true){
    document.getElementById('yes').style.display = 'block';          
  }
  else if(document.demo.weiter[1].checked == true){
    document.getElementById('no').style.display = 'block';
  }
  else{
    alert("Bitte eine Auswahl treffen");
  }
}
//-->
</script>

dann kommmt ein body-teil und dann die layer.. irgendwie klappt aber das auswahlverfahren wie gesagt immer nohc nicht mit dem weitermachen.. :(
 
he es funktioniert :-) habe einfach style="visibility: visible; benutzt anstatt dem block-befehl. jetzt hätte ich aber noch eine frage, wie könnte ich einen button machen, der immmer auf den zuletzt gezeigten layer geht, wenn ich auf dem nächsten bin.. weil mit history.back funktioniert ja nur bei frames.. wäre nett wenn da jemand was wüßte =)
 
ich schon wieder %) ich versuche jetzt noch das ganze als eine allgemeine funktion hinzubekommen, so dass ich nicht für jeden layer ein neues script brauche und auch noch mehr buttons einbauen kann..
Weiß nicht genau, was nocht nich passt, kann sich ja vielleicht mal wer angucken. Wäre nett, danke ;-)
Code:
 function Weiter() 
 {
	var checkwert=-1, wert, anzargs, layerid, args=Weiter.arguments;
	
	anzargs=args.length;
	varid=args[0];
	obj=document.getElementById( "F1" ); //
	alert( "Objekt="+obj);
	for(i=0;i<document.obj.length;++i)
  		if(document.obj[i].checked == true)
   		  checkwert=document.obj[i].value;

	//if( checkwert == -1 ) return;

	for (i=1; i<args.length; i+=2)
	{
		wert=args[i];
		layerid=args[i+1];
		alert("Frage="+varid+" Wert der Frage="+checkwert+"Vergleichswert="+wert+"LayerID="+layerid)
		if( wert == checkwert ){ZeigFrage( layerid, 1);return;}	
	}
 }


//-->
</script>
<DIV id="Q1" 
	 style="position:absolute; left:10px; top:160px; width:800px; height:200px; z-index:12; visibility: hidden;"
<b>Ja</b> <input name="F1" type=radio value=1> <b>Nein</b> <input name="F1" type=radio value=2>
<a href="javascript:Weiter('F1', '1', 'Q2', '2', 'Q3')">weiter</a>
 
Hallo,

Sorry, wollte dir schon lange Antworten, hatte es aber vergessen. Bei deinem Code steig ich nicht ganz durch, ich hab jetzt mal das so geschrieben wie ich mir denke das du es haben willst:

PHP:
<html>
<head>
<Script Language="JavaScript">
 
  var layer = new Array('q1','q2','q3','q4'); // Reihenfolge muss stimmen
  var history = new Array();
  
  function start(){
    for(var x=0; x<layer.length; x++){ //alle verstcken
      document.getElementById(layer[x]).style.display = 'none';
    }
    document.getElementById(layer[0]).style.display = 'block'; //Element 1 Sichtbar 
  }

  
  function next(current,next,dependance){
    if(dependance==null){
      document.getElementById(current).style.display = 'none';
      history.push(current);
      document.getElementById(next).style.display = 'block';
      
    }else{
      if(document.getElementsByName(dependance)[0].checked == true){
        document.getElementById(current).style.display = 'none';
        history.push(current);
        document.getElementById(next).style.display = 'block';
      }else{
        document.getElementById(current).style.display = 'none';
        history.push(current);
        document.getElementById((document.getElementsByName(dependance)[1].value)).style.display = 'block';
      }
    }
  }
  
  
  function prev(){
    var len = history.length;
    for(var x=0; x<layer.length; x++){ //alle verstcken
      document.getElementById(layer[x]).style.display = 'none';
    }
    document.getElementById(history[len-1]).style.display = 'block';
    history.pop();
  }
</script>

<style type=text/css>
.frage { position:absolute; 
         left:10px; 
         top:160px; 
         width:800px; 
         height:200px; 
         border:1px solid blue; 
         display:block;"
       }
</style>

</head>
<body bgcolor="#efefef" onload="start()">
<form name="demo">

  <div id="q1" class="frage">
    <h1>Startpage</h1>
    Ja <input name="f1" id="f1" type="radio" value="q2"> 
    Nein <input name="f1" id="f1" type="radio" value="q3">
    <a href="#" onClick="next('q1','q2','f1'); return false;">weiter zur nächsten Frage</a><br>
    <a href="#" onClick="prev(); return false;">zurück zur letzten Frage</a><br>
  </div>

  <div id="q2" class="frage">
    <h1>Level 1 - Ja</h1>
    Some Info<input name="F2" type=text> <br>
    Some Info 2<input name="F3" type=text> <br>
    <a href="#" onClick="next('q2','q4'); return false;">weiter zur nächsten Frage</a><br>
    <a href="#" onClick="prev(); return false;">zurück zur letzten Frage</a><br>
  </div>

  <div id="q3" class="frage">
    <h1>Level 1 - Nein</h1>
    Some Info<input name="F4" type=text> <br>
    Some Info 2<input name="F5" type=text><br> 
    <a href="#" onClick="next('q3','q4'); return false;">weiter zur nächsten Frage</a><br>
    <a href="#" onClick="prev(); return false;">zurück zur letzten Frage</a><br>
  </div>

  <div id="q4" class="frage">
    <h1>Level 2 </h1> 
    <input type="submit">
    <a href="#" onClick="prev(); return false;">zurück zur letzten Frage</a><br>
  </div>

</form>
</body>
</html>

Ok, was haben wir:

1) Layer Array, hier stehen alles Layer drin, wird gebraucht um alle schnell ausblenden zu können.

2) Ein History Array - mit dem verwirklichen wir die "zurück" Funktion.

3) onLoad wird die Funktion "start()" aufgerufen - diese blendet alle Ebenen aus, bis auf die erste.

4) function next(current,next,dependance) - Diese Funktion erwartet, als Parameter die aktuelle Ebene, die Follgende Ebende und ein Objekt von dem die follgende Ebene abhängt (dieser Parameter darf leer sein). OK, hört sich erstmal komisch an, aber ich versuche es zu erklären:

Szenario 1:
Layer1 mit 2 RadioButtons (name=R1) zum unterscheiden. Falls der erste Radio aktiviert ist, wird zur Ebene Layer2 weitergeleitet, wenn der zweite Radio aktiviert ist zur Ebene Layer3. Der Aufruf der Funktion würde nun so aussehen: next('Layer1','Layer2','R1')

Szenario 2:
Layer1 hat keine Untercheidungsmerkmale, der nächste Layer ist auf jeden Fall Layer2. Der Aufruf sieht dann wie folgt aus: next('Layer1','Layer2')

verstanden ;)?

5) zu guter Letzt haben wir noch prev(). Die Funktion bekommt keine Parameter und sollte immer Funktionieren :). Bei jedem Aufruf von next() wird die Id der aktuellen Ebene in die History geschrieben. Beim Aufruf von prev wird zurück auf das Vorletzte Element gesprungen, und das letzte gelöscht...

Ok, das wars, das ganze ist ziemlich universell gehalten. Bei fragen einfach nochmal posten.


ciao Andreas
 

Anhänge

super, :) weiß gar nicht wie ich dir danken soll. bin im mom auch eifrig am lesen, aber darauf wär ich glaub ich nie gekommen. kannst du mir vielleicht quellen nennen bzw wie du dir das wissen angeignet hast? weil so langsam gehen mir zu dem thema die quellen aus.. wäre nett, wenn du mir das noch sagen könntest. Habe DynamicWeb in 21Tagen und Selfhtml aber das reicht nicht wirklich aus.. Auf jedenfall erstmal ein großes dankeschön von mir, werde mich morgen gleich dransetzen, es verarbeiten und nachvollziehen.
***! :)
 

Neue Beiträge

Zurück