2013-03-27 2 views
0

У меня есть внешний файл javascript, который имеет две функции, и оба должны вызываться каждый раз, когда страница загружается. Однако, не делайте. Если я прокомментирую строку в js-файле, который вызывает функцию tester(), вызывается runGame(), но если тестер() не комментируется, то не запускается. Однако, если я положу вызов функции test() после вызова runGame(), то runGame() работает, но тестер() все еще не работает.Почему не вызываются вызовы, если один из них раскоментирован?

Тестер() даже не запускается сам по себе, поэтому, вероятно, что-то я сделал не так в этой функции. Может ли кто-нибудь сказать мне, что я сделал не так?

HTML

<html> 
<head> 
    <script type="text/javascript" src="rock_paper_scissors.js"> 

    </script> 

</head> 

<body> 
    <p id="game">Test</p> 
    <br /> 
    <input type="button" value="Play again" onClick="tester()"></input> 
</body> 

rock_paper_scissors.js

var info = document.getElementById("game"); 

var tester = function(){ 
    document.getElementById('game').innerHTML = 'hello'; 
    //info.innerHTML("HI"); 
}; 

var compare = function(choice1, choice2){ 
    if(choice1 == choice2) 
     document.write("The result is a tie!"); 
    else if(choice1 == "rock"){ 
     if(choice2 == "scissors") 
      document.write("You win! Rock wins"); 
     else 
      document.write("The computer wins! Paper wins"); 
    } 
    else if(choice1 == "paper"){ 
     if(choice2 == "rock") 
      document.write("You win! Paper wins"); 
     else 
      document.write("The computer wins! Scissors wins"); 
    } 
    else if(choice1 == "scissors"){ 
     if(choice2 == "rock") 
      document.write("The computer wins! Rock wins"); 
     else 
      document.write("You win! Scissors wins"); 
    } 
    else 
     document.write("You didn't pick a real choice"); 
}; 

var runGame = function(){ 

    var userChoice = prompt("Do you choose rock, paper or scissors?"); 
    var computerChoice = Math.random(); 
    if (computerChoice < 0.34) { 
     computerChoice = "rock"; 
    } else if(computerChoice <= 0.67) { 
     computerChoice = "paper"; 
    } else { 
     computerChoice = "scissors"; 
    } 


    document.write("<p>You picked " + userChoice + "</p>"); 
    document.write("<p>The Computer picked " + computerChoice + "</p>"); 
    compare(userChoice, computerChoice); 
}; 



runGame(); 
tester(); 
+1

Поместите тег сценария после тега закрытия тела, чтобы он загружался только при загрузке DOM. – zz3599

+1

Проверьте консоль javascript ... вы не можете изменить DOM перед ее загрузкой. Переместите теги '' непосредственно перед '' – jeremy

+0

@ zz3599 вы имеете в виду * перед *? Я никогда не слышал об этом. – jeremy

ответ

2

Вы уверены, что элемент с ID "игра" существует? [EDIT: просто взглянул на ваш код - ваш скрипт находится в HEAD, что означает, что он выполняется до загрузки game, и поэтому он определенно не существует.] Если это не так, info - null и доступ к innerHtml из null сломает ваш код. Проверьте консоль JavaScript, чтобы увидеть ошибку.

Вы должны либо переместить код ниже game элемента (где-то между ним и концом тела будет делать, традиционно как раз перед body закрывающим тегом), или запустить свой код из обработчика load событий тела, или использовать библиотеку такой как jQuery, который предоставляет событие ready.

Причина первая линия (один не используется info) не сломать ваш код является тот факт, что вы найти game элемент в данный момент tester запускается (который будет гораздо позже, чем этот документ полностью), а не при обнаружении тега скрипта (который, как вы заметили, не работает).

+0

Спасибо , Это сработало. Теперь я понимаю – rasen58

+0

Также благодарю вас за информацию об информации. Я тоже это исправил. – rasen58

0

Хорошо, что нужно всегда: проверьте консоль javascript.

Вы не можете изменить DOM перед его загрузкой. Переместите теги <script...> прямо перед </body>.

+0

Спасибо, я вижу сейчас – rasen58

+0

Почему dv? Объясните пожалуйста. – jeremy

Смежные вопросы