I'm using PHP HTML and JavaScript to write questions that need to be shown/hidden based on inputs from the user. I have several rows in a table, each row contains a <td>
with a question and a <td>
with an input (for the answer to the question) and I am using JavaScript to hide/show rows that contain questions that sometimes aren't applicable to the user if they've answered questions with a certain answer.
For example, Question 1 should always be displayed, Question 2 only displays if the answer to question one is not yes (I have to allow the possibility that the answer is blank). Question 3 should display if Question 2's answer is not yes.
Also, if question 1's answer is changed to something other than yes. Question 2 and 3 should be hidden.
The code works correctly, but is there a more efficient method to write the code rather than repeating the cumbersome boolean logic shown below? To make more questions I need to copy and paste the code and change the boolean conditions and the Element IDs for each question.
// question asks them if they served in a second branch of the military
// if hideAllQuestions is true, then all questions that rely on this
// question and questions relying on those questions should disappear.
// if showMainQuestion is true, then all immediate follow up questions
var secondBranchLogic = function(hideAllQuestions = false, showMainQuestion = true)
{
var mainQuestionTagID = [ "#secondbranch_row" ];
if (showMainQuestion) {
// functions that cycle through each question in mainQuestionTagID and show them, set them to required, or hide them.
enableQuestions(mainQuestionTagID);
requireQuestions(mainQuestionTagID);
} else {
disableQuestions(mainQuestionTagID);
}
// boolean logic that determines if the main question's answer should show/hide the sub questions.
var answer = $("#secondbranch").val();
var hasSecondBranch = ( answer === 'Yes');
var showSubQuestions = (showMainQuestion && hasSecondBranch && !hideAllQuestions);
// all immediate sub questions that should be shown/hidden, but not the sub questions below said sub questions.
var questionTagIDs = [
"#militarybranch2_row",
"#militarybranch2length_row",
"#militarybranch2rank_row",
"#militarybranch2job_row" ];
if (showSubQuestions) {
enableQuestions(questionTagIDs);
requireQuestions(questionTagIDs);
} else {
disableQuestions(questionTagIDs);
}
// boolean logic determining if dischargeLogic should hide/show some questions.
var hideNextQuestions = ( answer === '' || hideAllQuestions );
var showNextMainQuestion = ( !hideNextQuestions);
dischargeLogic(hideNextQuestions, showNextMainQuestion);
};
// question asking if they were discharged honorably
// this function behaves much like the previous one.
var dischargeLogic = function(hideAllQuestions = false, showMainQuestion = true)
{
var mainQuestionTagID = [ "#honorabledischarge_row" ];
if (showMainQuestion) {
enableQuestions(mainQuestionTagID);
requireQuestions(mainQuestionTagID);
} else {
disableQuestions(mainQuestionTagID);
}
var answer = $("#honorabledischarge").val();
var answered = (answer !== '');
var questionTagIDs = [ "#dischargedescription_row" ];
if (answered)
{
honorablyDischarged = (answer === 'Yes');
showSubQuestion = (!honorablyDischarged && !hideAllQuestions);
if (showSubQuestion) {
enableQuestions(questionTagIDs);
requireQuestions(questionTagIDs);
} else {
disableQuestions(questionTagIDs);
}
} else {
disableQuestions(questionTagIDs);
}
var hideNextQuestions = ( answer === '' || hideAllQuestions);
var showNextMainQuestion = (!hideNextQuestions);
deploymentsLogic(hideNextQuestions, showNextMainQuestion);
};
Now, here's the PHP/HTML code for it:
<tr style="display:none;" id="secondbranch_row">
<td class="Question">
Have you served in another military branch?
</td>
<td style="width:100px;">
<select type="text" id="secondbranch" name="secondbranch" style="width:100%;" class="needs_saved_military" required>
<option value=''></option>
<option value='Yes'>Yes</option>
<option value='No'>No</option>
</select>
</td>
</tr>
<tr style="display:none;" id="militarybranch2_row">
<td>
Which branch did you serve in?
</td>
<td>
<select type="text" id="militarybranch2" name="militarybranch2" style="width:100%;" class="needs_saved_military" required>
<option value=''></option>
<!-- all caps means it's a global constant array -->
<?php foreach (MILITARY_BRANCH as $iBranch)
{?>
<option value = "<?php echo $iBranch?>"><?php echo $iBranch?> </option>
<?php }?>
</select>
</td>
</tr>
<tr style="display:none;" id="militarybranch2length_row">
<td>
How long?
</td>
<td>
<select type="text" id="militarybranch2length" name="militarybranch2length" style="width:100%;" class="needs_saved_military" required>
<option value=''></option>
<?php foreach (MILITARY_YEARS_SERVED as $iYears)
{?>
<option value = "<?php echo $iYears?>"><?php echo $iYears?> </option>
<?php }?>
</select>
</td>
</tr>
<tr style="display:none;" id="militarybranch2rank_row">
<td>
What was your rank?
</td>
<td>
<input type="text" id="militarybranch2rank" name="militarybranch2rank" style="width:100%;" class="needs_saved_military" required></input>
</td>
</tr>
<tr style="display:none;" id="militarybranch2job_row">
<td>
What was your job?
</td>
<td>
<input type="text" id="militarybranch2job" name="militarybranch2job" style="width:100%;" class="needs_saved_military" required></input>
</td>
</tr>
<!-- HONORABLE DISCHARGE -->
<tr style="display:none;" id="honorabledischarge_row">
<td class="Question">
Were you honorably discharged?
</td>
<td style="width:100px;">
<select type="text" id="honorabledischarge" name="honorabledischarge" style="width:100%;" class="needs_saved_military" required>
<option value=''></option>
<option value='Yes'>Yes</option>
<option value='No'>No</option>
</select>
</td>
</tr>
<tr style="display:none;" id="dischargedescription_row">
<td>
What was the discharge?
</td>
<td>
<input type="text" id="dischargedescription" name="dischargedescription" style="width:100%;" class="needs_saved_military" required></input>
</td>
</tr>
display: none
removed from the style? Also, you stated “Question 3 should display if Question 2's answer is not yes.” but question 2 does not look like a yes/no question... \$\endgroup\$secondBranchLogic()
anddischargeLogic()
so we can see what parameters are passed? \$\endgroup\$