아핫뉴스실시간 인기검색어
아핫뉴스 화산 이미지
아하

생활

생활꿀팁

색다른줄나비175
색다른줄나비175

자바스크립트가 정상작동하지 않는 이유가 뭐죠? $question 과 $feedback에서 눌값이 나오는 이유가 뭐죠?

function update(element,content,klass) {

var p = element.firstChild || document.createElement("p");

p.textContent = content;

element.appendChild(p);

if(klass) {

p.className = klass;

}

}

complete JS file

var button = document.getElementById("button");

var rainbow = ["red","orange","yellow","green","blue","indigo","violet"];

//// dom references ////

var $question = document.getElementById("question");

var $score = document.getElementById("score");

var $feedback = document.getElementById("feedback");

function update(element,content,klass) {

var p = element.firstChild || document.createElement("p");

p.textContent = content;

element.appendChild(p);

if(klass) {

p.className = klass;

}

}

var score = 0;

var quiz = {

"name": "Super Hero Name Quiz",

"description": "How many super heroes can you name",

"question": "What is the real name of ",

"questions": [

{"question" : "Superman", "answer": "Clarke Kent"},

{"question" : "Batman" , "answer": "Bruce Wayne"},

{"question" : "Wonder Woman", "answer": "Dianna Prince"}

]

}

function play(quiz){

for(var i= 0,question,answer,max=quiz.questions.length;i<max;i++){

question = quiz.questions[i].question;

answer = ask(question);

check(answer,i);

}

gameOver();

}

play(quiz);

function ask(question){

update($question,quiz.question + question)

return prompt("Enter your awnser");

}

function check(answer,index){

if(answer === quiz.questions[index].answer){

update($feedback,"Correct!","right");

score++;

}

else{

update($feedback,"Wrong!","wrong");

}

}

function gameOver(){

update($question,"Game Over, you scored " + score + "points");

}

Html file

<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8">

<meta name="description" content="A quiz game for ninjas">

<meta name="author" content="DAZ">

<title>Quiz Ninja</title>

<link rel="stylesheet" href="css/style.css">

</head>

<body>

<header>

<h1>Quiz Ninja!</h1>

<p>Score: <strong id="score">0</strong></p>

</header>

<script src="js/scripts.js"></script>

<section id="question">

<p>Question:</p>

</section>

<section id="feedback">

<p>Feedback</p>

</section>

</body>

</html>

    55글자 더 채워주세요.
    3개의 답변이 있어요!
    • 탈퇴한 사용자
      탈퇴한 사용자

      일단 원인은 DOM 초기화 전에 자바스크립스가 수행되는 것에 있습니다.

      외부 자바스크립트 파일인 js/scripts.js에 의해 자바스크립트가 HTML문서에 삽입됩니다.

      아직 DOM이 만들어지지 않았으므로 자바스크립트를 해석하는 시점에는 엘리먼트가 존재하지 않습니다.

      따라서 null 값을 가지게 됩니다.

      따라서 DOM 초기화가 된 이후에 document.getElementById을 통해서 엘리먼트를 가져와야 합니다.

      아래의 이벤트 리스너에 DOM이 로드가 완료된 이후에 수행되도록 하시면 되겠습니다.

      document.addEventListener("DOMContentLoaded", function () {

      //// dom references ////

      }

      마찬가지로 게임을 시작하는 play(quiz); 역시 해당 이벤트 리스너에 있어야겠지요.

    • 안녕하세요.

      정확한 에러메세지를 알아야 원인을 찾을 수 있을거 같네요.

      질문주신 내용으로 유추해보자면

      해당 페이지 dom 파일에 element가 없는걸로 판단됩니다.

      var $question = document.getElementById("question");

      var $feedback = document.getElementById("feedback");

      가져오는 객체가 없는게 아닐지요?

      해당 html에 question 과 feedback 을 id로 가지는 element가 있는지 체크해보세요.

      그리고 브라우져 상에서 해당 함수를 실행할 때 어느부분에서 에러가 나는지

      디버깅 체크해보시길 바랍니다.

    • 원인은 순서상의 이유입니다.

      head를 먼저 읽고 body를 읽기 때문입니다.

      head를 먼저 읽기 때문에 document는 값이 없는 상태입니다.

      방법은

      1. javascript를 body의 맨 아래쪽으로 옮기는 방법

      2. window.onload 를 통해 문서를 로드가 완료되는 시점에 실행시키도록 하는 방법이 있습니다. (추천)

      window.onload = function() { var button = document.getElementById("button"); var rainbow = ["red","orange","yellow","green","blue","indigo","violet"]; //// dom references //// var $question = document.getElementById("question"); var $score = document.getElementById("score"); var $feedback = document.getElementById("feedback"); function update(element,content,klass) { var p = element.firstChild || document.createElement("p"); p.textContent = content; element.appendChild(p); if(klass) { p.className = klass; } } var score = 0; var quiz = { "name": "Super Hero Name Quiz", "description": "How many super heroes can you name", "question": "What is the real name of ", "questions": [ {"question" : "Superman", "answer": "Clarke Kent"}, {"question" : "Batman" , "answer": "Bruce Wayne"}, {"question" : "Wonder Woman", "answer": "Dianna Prince"} ] } function play(quiz){ for(var i= 0,question,answer,max=quiz.questions.length;i<max;i++){ question = quiz.questions[i].question; answer = ask(question); check(answer,i); } gameOver(); } play(quiz); function ask(question){ update($question,quiz.question + question); return prompt("Enter your awnser"); } function check(answer,index){ if(answer === quiz.questions[index].answer){ update($feedback,"Correct!","right"); score++; } else{ update($feedback,"Wrong!","wrong"); } } function gameOver(){ update($question,"Game Over, you scored " + score + "points"); } }