我无法理解为什么我的代码无效。简单地说,有三个功能级别:一个启动进程的访问功能,一个作为程序核心的DOB功能,以及包含一个我为了识别而标记的问题功能的几个功能。
如果我使用我直接输入的数字运行DOB功能,它可以工作。但是当用户从下拉菜单中选择数字时,其中的PROBLEM功能失败。在更改为具有临时变量的访问函数之前,我有一个jquery go按钮,以获得相同的结果。我尝试将PROBLEM功能从开关更改为if-elses更改名称,但我修改的内容没有任何效果。
这个问题困扰了我近一个星期。我自己编码和教学是全新的,所以我可能会错过一些明显的范围或对象参考问题。任何帮助将不胜感激。 (代码已经简化,所有关键组件都完好无损。)((DOB函数中需要相同临时变量的闰年函数似乎有效。)
更新:做了一些小改动。测试了很多。问题功能仍然是罪魁祸首,我不明白为什么。如果我输入数值,它可以正常工作,但它不会从我尝试从表单中存储的值中获取值。
<!DOCTYPE html>
<html>
<body>
<form id="myForm" class="form">
<p><b> Month</b></p>
<select id="Bmonth" class="date">
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
</select>
<p><b>Day</b></p>
<select id="Bdom" class="date">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<p><b>Year</b> </p>
<select id="Byear" class="date">
<option value="2015">2015</option>
<option value="2014">2014</option>
<option value="2013">2013</option>
</select>
<p class="clear">
<input type="button" onclick="access()" value="Submit">
</p>
</form>
<script>
function access() {
var tempElement = document.getElementById("Bmonth");
Bmonth = tempElement.options[tempElement.selectedIndex].value;
var tempElement = document.getElementById("Bdom");
Bdom = tempElement.options[tempElement.selectedIndex].value;
var tempElement = document.getElementById("Byear");
Byear = tempElement.options[tempElement.selectedIndex].value;
return DOB(Bmonth, Bdom, Byear);
}
/*This function determines time intervals
between birth date and current date.*/
function DOB(Bmonth, Bdom, Byear) {
//Get Current Date//
var today = new Date();
var Cmonth = today.getMonth();
var Cdom = today.getDate();
var Cyear = today.getFullYear();
function PROBLEM(Month, DOM) {
switch (Month) {
case 1: return 0 + DOM; break;
case 2: return 31 + DOM; break;
case 3: return 59+ DOM; break;
}
}
/*Find Current and Birth Day of Year
By Calling Function Above */
CDOY = PROBLEM(Cmonth + 1, Cdom);
BDOY = PROBLEM(Bmonth, Bdom);
//Find Differences//
var DayCount = CDOY - BDOY;
var YearCount = Cyear - Byear;
// This function determines the number of leap years//
function Leap(Bmonth, Bdom, Byear, Cmonth, Cyear) {
var LeapYear = 0;
if ((Byear % 4 == 0 && (Byear % 100 !== 0 || Byear % 400 == 0)) &&
(Bmonth >= 3 || Bmonth == 2 && Bdom == 29)) {
LeapYear--;
}
if ((Cyear % 4 == 0 && (Cyear % 100 !== 0 || Cyear % 400 == 0)) &&
Cmonth < 3) {
LeapYear--;
}
for (var i = Cyear; i >= Byear; i--) {
if ((i % 4 == 0) && ((i % 100 !== 0) || (i % 400 == 0)))
{ LeapYear++; };
}
return LeapYear;
}
//Call function above//
var LeapYear = Leap(Bmonth, Bdom, Byear, Cmonth, Cyear);
//Find Total Days//
var TotalDays = 365 * YearCount + DayCount + LeapYear;
//Find Variables//
var Days = TotalDays;
var Hours = Days * 24;
var Minutes = Hours * 60;
var Seconds = Minutes * 60;
var Output, Units;
//Use Random Number Generator to Vary Output with Units//
var random = Math.ceil(Math.random() * 4);
switch (random) {
case 1: Output = Days; Units = 'days old.'; break;
case 2: Output = Hours; Units = 'hours old.'; break;
case 3: Output = Minutes; Units = 'minutes old.'; break;
case 4: Output = Seconds; Units = 'seconds old.'; break;
default: Output = 0; Units = 'units.'; break;
}
var Greeting;
//Use Random Number Generator to Vary Greeting//
var r = Math.ceil(Math.random() * 3);
switch (r) {
case 1: Greeting = 'Congrats!'; break;
case 2: Greeting = 'Yes!'; break;
case 3: Greeting = 'Check it.'; break;
}
function commas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
var Number = commas(Output);
return window.alert(Greeting + "You are " + Number + " " + Units);
}
</script>
</body>
</html>
答案 0 :(得分:0)
PROBLEM
不会返回任何值,这意味着
CDOY = PROBLEM(Cmonth + 1, Cdom);
BDOY = PROBLEM(Bmonth, Bdom);
CDOY
和BDOY
中的结果始终为undefined
。试试这个:
function PROBLEM(Month, DOM) {
switch (Month) {
case 1: return 0;
case 2: return 31;
case 3: return 59;
}
}
除此之外:我强烈建议您在调试器中轻松完成代码,这样您就可以准确了解每一步的发生情况。祝你好运,不要放弃!
答案 1 :(得分:0)
我很欣赏这个委员会和所有的建议。我想通过在函数函数中声明函数内部的问题来要求它。我已经能够通过使用:
解决问题 return DOB(Number(Bmonth), Number(Bdom), Number(Byear));
我没有意识到变量没有被转移为实际数字。去图。
答案 2 :(得分:-1)
永远不要在另一个函数声明中嵌套函数声明(命名函数)。例如。从父函数中提取它,并返回结果。
function PROBLEM(Month, DOM) {
var MAD;
switch (Month) {
case 1: MAD = 0; break;
case 2: MAD = 31; break;
case 3: MAD = 59; break;
}
return MAD;
}
然后在DOB功能中,您可以像
一样调用此代码段var MAD = PROBLEM(Bmonth, Cdom);
对所有函数调用执行此操作并重新测试。