0
<button onclick="isleap(1992)">Try it</button>​

function isleap(year);
{
var yr=document.getElementById("year").value;
if ((parseInt(yr)%4) == 0)
{
 if (parseInt(yr)%100 == 0)
 {
 if (parseInt(yr)%400 != 0)
 {
 alert("Not Leap");
 return "false";
 }
  if (parseInt(yr)%400 == 0)
  {
  alert("Leap");
    return "true";
    }
  }
  if (parseInt(yr)%100 != 0)
  {
    alert("Leap");
    return "true";
  }
 }
 if ((parseInt(yr)%4) != 0)
 {
    alert("Not Leap");
    return "false";
 } 
}

​</p>

http://jsfiddle.net/kcyCd/

在弄清楚如何让代码弹出带有闰年答案的警报框时遇到问题。

4

4 回答 4

3

一个简单的isLeapYear功能是:

function isLeapYear(year) {
  var d = new Date(year, 1, 29);
  return d.getMonth() == 1;
}

它只是查看 2 月 29 日是否发生在给定的年份。你应该能够做到:

function isLeapYear2(year) {
  return !!Date.parse(year + '-02-29');
}

基于解析无效日期应返回 NaN,其类型转换为 false,但并非所有浏览器都正确实现Date.parse. 例如

isLeapYear2('2001'); // false in Firefox, true in IE
于 2012-11-07T00:10:25.143 回答
1
<button onclick="alert(isleap(1992));">Try it</button>

如果您提醒从 isleap 函数返回的值,它应该可以工作。我不保证弹出的答案是正确的。

于 2012-11-07T00:09:21.167 回答
0

您的小提琴不起作用,因为您保留了将 JS 放置在onload处理程序中的默认 jsfiddle 设置,这意味着您的函数不是全局的,并且无法从 inlineonclick属性访问 - 这应该在下拉列表中更改在左侧到“不换行”设置之一。此外,如果调用该函数,该函数要做的第一件事是尝试从具有 id 的元素中读取值,"year"而您没有这样的元素。您当前忽略该year参数。

话虽如此,您的功能比它需要的要复杂得多。parseInt() 您可以通过在开始时执行一次来大大简化您的代码,然后如果要测试的值不是整数,则执行您需要执行的任何操作,然后您只需一行即可执行闰年测试。

此外,如果您parseInt()在用户输入上使用,如果您想避免由于以前导零开头的输入被视为八进制而导致的模糊错误,则必须指定一个基数作为第二个参数。所以parseInt(year, 10)

最后,为什么要返回字符串"true""false"?返回实际的布尔值是否更有意义,以便您可以将函数调用为:

if (isleap(1992)) {
   // do something
}

无论如何,这是一个简短的版本:

function isleap(year) {
    year = parseInt(year,10);
    if (isNaN(year)) {
       alert("Not a number");
       return false;
    }
    if (year%4===0 && (year%100!=0 || year%400===0)) {
       alert("Leap");
       return true;
    } else {
       alert("Not leap");
       return false;
    }
}

演示:http: //jsfiddle.net/kcyCd/1/

如果您不需要显示警报,您可以将其缩短:

function isleap(year) {
    year = parseInt(year,10);
    if (isNaN(year)) {
       alert("Not a number");
       return false;
    }
    return (year%4===0 && (year%100!=0 || year%400===0));
}

显然,如果您不需要测试无效值,它将是单行的。

于 2012-11-07T00:35:25.620 回答
0

您将一个值传递给函数,然后在 DOM 中寻找一个不存在的不同值。

此外,由于您合并了真/假条件,并且您使用的是字符串而不是布尔值,因此代码很难遵循 - 这很糟糕,因为 if(isleap(1992)) 在您的代码中将始终为真。

简化:

function isleap(year)
{
    if(year % 4 == 0 || (year % 100 == 0 && year % 400 == 0)){
        return true;
    }
    return false;
}
于 2012-11-07T00:08:42.107 回答