未捕获的引用错误——一个函数工作而另一个不起作用

Uncaught Reference Error - one function works the other doesn't

本文关键字:一个 函数 工作 不起作用 另一个 引用 错误      更新时间:2023-09-26

我在这里读过很多关于未捕获的引用错误的文章,并且认为我已经掌握了这个想法-当脚本试图调用函数或引用尚未初始化的变量时。然而,我不确定如何解决这个问题,以及为什么在我的情况下一个函数工作,而另一个不。

我有一个JS文件,其中有两个函数,一个HTML文件,一个表单。表单调用function1 onSubmit,这很好地工作了。表单内部的单选按钮调用function2 onClick,这就是我得到错误的时候:

Uncaught ReferenceError: toggleGender is not defined onclick @ forms.html:20

为什么我的第一个函数可以工作而第二个不行?在我看来,他们是在同一个前提下运作的。

function calculatePFT()
{
  var userForm = document.getElementById('userValues');
  var pullups = userForm.userPullups.value;
  var crunches = userForm.userCrunches.value;
  var runMinutes = userForm.userMinutes.value;
  var runSeconds = userForm.userSeconds.value;
  
  var runScore = 0;
  
  if(runMinutes < 18) { runScore = 100; }
  else
  {
    var minDiff = runMinutes - 18;
    var minPoints = minDiff * 6;
    var secPoints = Math.ceil(runSeconds/10);
    
    runScore = 100 - (minPoints + secPoints);
  }
  
  var score = parseInt(pullups*5) + parseInt(crunches) + parseInt(runScore);
  
  document.getElementById('scoreBox').innerHTML = "You scored " + pullups + " pullups and " + crunches + " crunches and a run time of " + runMinutes + " minutes " + runSeconds + " seconds.  TOTAL SCORE: " + score;
}
function toggleGender(var gender)
{
  alert("Inside");
  var maleForm = document.getElementById('male');
  var femaleForm = document.getElementById('female');
  
  if(gender == "f")
  {
    alert("Female");
    maleForm.style.display = 'none';
    femaleForm.style.display = 'block';
  }
  else
  {
    alert("Male");
    maleForm.style.display = 'block';
    femaleForm.style.display = 'none';
  }
}
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Javascript Testing</title>
<link rel="stylesheet" href="style.css" />
<script src="scripts.js"></script>
</head>
<body>
<section id="wrapper">
<h3>PFT Calculator</h3>
<form action="#" id="userValues" method="post" onSubmit="calculatePFT()">
  <div id="gender">
    <span class="maleFemale">Male <input type="radio" name="maleFemale" value="male" CHECKED onClick="toggleGender('m')" /></span>
    <span class="maleFemale">Female <input type="radio" name="maleFemale" value="female" onClick="toggleGender('f')" /></span>
  </div>
  
  <div id="male">
    <div class="scoreLine">
      <div class="label">Pullups:</div>
      <div class="entry"><input type="number" name="userPullups" min="0" max="20" default="18" class="scoreEntry" required /></div>
    </div>
  </div>
  
  <div id="female">
    <div class="scoreLine">
      <div class="label">Hang:</div>
      <div class="entry"><input type="number" name="userHang" min="0" max="150" default="70" class="scoreEntry" required /></div>
    </div>
  </div>
  
  <div class="scoreLine">
    <div class="label">Crunches:</div>
    <div class="entry"><input type="number" name ="userCrunches" min="0" max="100" default="100" class="scoreEntry" required /></div>
  </div>
  <div class="scoreLine">
    <div class="label">Run (Minutes):</div>
    <div class="entry"><input type="number" name="userMinutes" min="0" max="100" default="19" class="scoreEntry" required /></div>
  </div>
  <div class="scoreLine">
    <div class="label">Run (Seconds):</div>
    <div class="entry"><input type="number" name="userSeconds" min="0" max="59" default="30" class="scoreEntry" required /></div>
  </div>
  
  <div style="text-align:center;"><input type="submit" value="Calculate Score!" id="submitButton" /></div>
  
</form>
<span id="scoreBox"></span>
</section>
</body>
</html>

function toggleGender(var gender)

这里有一个语法错误。参数名不应该以var作为前缀。这将导致函数声明失败(因此当您尝试调用它时会得到引用错误)。

function calculatePFT()
{
  var userForm = document.getElementById('userValues');
  var pullups = userForm.userPullups.value;
  var crunches = userForm.userCrunches.value;
  var runMinutes = userForm.userMinutes.value;
  var runSeconds = userForm.userSeconds.value;
  
  var runScore = 0;
  
  if(runMinutes < 18) { runScore = 100; }
  else
  {
    var minDiff = runMinutes - 18;
    var minPoints = minDiff * 6;
    var secPoints = Math.ceil(runSeconds/10);
    
    runScore = 100 - (minPoints + secPoints);
  }
  
  var score = parseInt(pullups*5) + parseInt(crunches) + parseInt(runScore);
  
  document.getElementById('scoreBox').innerHTML = "You scored " + pullups + " pullups and " + crunches + " crunches and a run time of " + runMinutes + " minutes " + runSeconds + " seconds.  TOTAL SCORE: " + score;
}
function toggleGender(gender)
{
  alert("Inside");
  var maleForm = document.getElementById('male');
  var femaleForm = document.getElementById('female');
  
  if(gender == "f")
  {
    alert("Female");
    maleForm.style.display = 'none';
    femaleForm.style.display = 'block';
  }
  else
  {
    alert("Male");
    maleForm.style.display = 'block';
    femaleForm.style.display = 'none';
  }
}
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Javascript Testing</title>
<link rel="stylesheet" href="style.css" />
<script src="scripts.js"></script>
</head>
<body>
<section id="wrapper">
<h3>PFT Calculator</h3>
<form action="#" id="userValues" method="post" onSubmit="calculatePFT()">
  <div id="gender">
    <span class="maleFemale">Male <input type="radio" name="maleFemale" value="male" CHECKED onClick="toggleGender('m')" /></span>
    <span class="maleFemale">Female <input type="radio" name="maleFemale" value="female" onClick="toggleGender('f')" /></span>
  </div>
  
  <div id="male">
    <div class="scoreLine">
      <div class="label">Pullups:</div>
      <div class="entry"><input type="number" name="userPullups" min="0" max="20" default="18" class="scoreEntry" required /></div>
    </div>
  </div>
  
  <div id="female">
    <div class="scoreLine">
      <div class="label">Hang:</div>
      <div class="entry"><input type="number" name="userHang" min="0" max="150" default="70" class="scoreEntry" required /></div>
    </div>
  </div>
  
  <div class="scoreLine">
    <div class="label">Crunches:</div>
    <div class="entry"><input type="number" name ="userCrunches" min="0" max="100" default="100" class="scoreEntry" required /></div>
  </div>
  <div class="scoreLine">
    <div class="label">Run (Minutes):</div>
    <div class="entry"><input type="number" name="userMinutes" min="0" max="100" default="19" class="scoreEntry" required /></div>
  </div>
  <div class="scoreLine">
    <div class="label">Run (Seconds):</div>
    <div class="entry"><input type="number" name="userSeconds" min="0" max="59" default="30" class="scoreEntry" required /></div>
  </div>
  
  <div style="text-align:center;"><input type="submit" value="Calculate Score!" id="submitButton" /></div>
  
</form>
<span id="scoreBox"></span>
</section>
</body>
</html>