闰年无法获得javascript弹出警报

时间:2012-11-07 00:05:41

标签: javascript date

<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";
 } 
}

http://jsfiddle.net/kcyCd/

在找出如何让代码弹出警报框以及闰年答案时遇到问题。

4 个答案:

答案 0 :(得分: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。 e.g。

isLeapYear2('2001'); // false in Firefox, true in IE

答案 1 :(得分:1)

<button onclick="alert(isleap(1992));">Try it</button>

如果你警告isleap函数返回的值,它应该工作。我不保证弹出的答案是正确的。

答案 2 :(得分:0)

您正在将值传递给函数,然后在DOM中查找不存在的值。

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

简化为:

function isleap(year)
{
    if(year % 4 == 0 || (year % 100 == 0 && year % 400 == 0)){
        return true;
    }
    return false;
}

答案 3 :(得分:0)

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

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

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

最后,为什么要返回字符串parseInt(year, 10)"true"?返回实际的布尔值是否更有意义,以便您可以将您的函数称为:

"false"

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

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

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

如果您不需要显示警告,则可以缩短警告:

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;
    }
}

如果你不需要测试无效值,显然这将是一个单行。