Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community!
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trial

David Drysdale
10,815 PointsHelp with JavaScript and AJAX
Hi,
I'm trying to apply some of what I learned about JavaScript and AJAX by making my own trivia game from scratch. However, I'm not getting the behaviour I expected from my code. When I preview, I get an error that my questions variable does not exist; I'm also apparently not getting to my readystate === 4 in my if statement.
For context, I have a JSON file of trivia questions, and I am trying to be able to use that list so I can pull out questions to display to the user.
My Workspace is here: https://w.trhou.se/1dishlso3b
Here's my scripts.js file right now:
// Initializes the game
function initialize() {
var questionCounter = 0;
var score = 0;
var wrongAnswers = 0;
var questions = [];
console.log(questions);
buildQuestionList();
console.log(questions);
drawGameInterface();
};
// get the list of questions
function buildQuestionList() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
var questionsJSON = JSON.parse(xhr.responseText);
questions.push(questionsJSON);
alert("In the JSON if statement");
} else {
document.getElementById('questionDiv').innerHTML = "<p>There has been an error.</p>";
console.log("In the JSOn else statement");
}
}
xhr.open('GET', 'questions.json');
xhr.send();
};
//draw the game interface
function drawGameInterface() {
$("#welcome").toggle("slow");
$("#answerDiv").toggle("slow");
$("#scoreDiv").toggle("slow");
};
// hides the placeholder text when user clicks in the answer box-sizing
$("#answer").focus(function() {
$("#answer").val("");
});
I'd love any help you can provide!
2 Answers

David Drysdale
10,815 PointsWhoops! Thanks--fixed now.

jag
18,266 PointsHere are some things I noticed:
- Extra closing body tag
- Didn't close ul tag for .wrongResponses
- Since you are using Ajax might as well use $.getJSON()
- If you check your browsers console an error saying question is undefined which breaks your whole code
function buildQuestionList() {
$.getJSON('questions.json', function (data){
$.each(data, function(key, val){
console.log(val.question);
console.log(val.answer);
});
});
};

jag
18,266 Points// Initializes the game
function initialize() {
var questionCounter = 0;
var score = 0;
var wrongAnswers = 0;
var questions = [];
console.log(questions);
buildQuestionList();
console.log(questions);
drawGameInterface();
};
// get the list of questions
function buildQuestionList() {
$.getJSON('questions.json', function (data){
// Store Q&A in Arrays
var questions = []
var answers = []
var i = 0
$.each(data, function(key, val){
// Adds questions to question array
questions.push(val.question);
// Adds answers to answers array
answers.push(val.answer);
});
// console.log(questions[i] + "Questions")
// Loop forever until condition is met
do {
// Ask user a question, remove hint just testing purposes
var response = prompt(questions[i], 'hint it is' + answers[i])
console.log(i < questions.length);
// User gets it right then treated unto the next question
if(response === answers[i]){
console.log('correct, next question')
// Goes to next item in Q&A Arrays
i++
}else if(response === "end"){
// User can give up by entering end
console.log("This ends now.")
break;
}else{
// User gets wrong answer, send message
console.log('wrong, till you get it right')
}
// Condition while the array has enough question, quiz will keep looping
} while(i < questions.length)
});
};
//draw the game interface
function drawGameInterface() {
$("#welcome").toggle("slow");
$("#answerDiv").toggle("slow");
$("#scoreDiv").toggle("slow");
};
// hides the placeholder text when user clicks in the answer box-sizing
$("#answer").focus(function() {
$("#answer").val("");
});
// display a question
/*
function getQuestion() {
$("#answer").val("My Answer Is...")
console.log(questions[0].category);
questionHTML = "<p>" + questions[0].question + "</p>"
document.getElementById('questionDiv').innerHTML = questionHTML;
}
};
};
// get the user's answer
$("#answerForm").submit(function(){
event.preventDefault();
var userAnswer = $('#answer').val().toLowerCase();
var correctAnswer = questions[0].answer;
if (userAnswer === correctAnswer) {
score++;
} else {
$(".wrongResponses").append("<li>✖</li>")
wrongAnswers++;
if (wrongAnswers === 3) {
$("#welcome").toggle("slow");
$("#answerDiv").toggle("slow");
$("#scoreDiv").toggle("slow");
}
}
})
// check if the answer is correct
// adjust the score
*/
Here is the quiz using Arrays, for while loop, prompt & getJSON. If you need any help feel free to ask.
miikis
44,944 Pointsmiikis
44,944 PointsHi David,
Your workspaces link doesn't work. You have to take a Snapshot of your workspace and then post that link. Here's some instructions.