带开关盒的功能无法提供输出

时间:2019-04-09 13:33:15

标签: javascript jquery html css

我有一个获取日期并应该根据日期返回符号的函数。例如,如果输入为15.4.1996

输出将是白羊座

我只检查日和月(年不计),但问题是我现在没有得到任何输出。为什么?

function yourSign() {
    var signDate = $("input[name='birthDate']").val();
    switch (signDate) {

        case 0:
            outputSign = "Aries"

            var dateFrom = "21/03";
            var dateTo = "20/04";

            var dateFrom = dateFrom.split("/");
            var dateTo = dateTo.split("/");

            var from = new Date(d1[2], parseInt(d1[1]) - 1); // -1 because months are from 0 to 11
            var to = new Date(d2[2], parseInt(d2[1]) - 1);
            signDate = new Date(c[2], parseInt(c[1]) - 1);

            var signOutput = console.log(signDate > from && signDate < to)
            $("#output").val(signOutput);

            //  document.getElementsByName('output')[0].value = signOutput;
    }
}
<head>
   <meta charset="utf-8" />
   <title>your sign</title>
   <link rel="stylesheet">
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
   <div>
   <form id="yourSign">
      <label for=birthDate>birthdate</label><br /><input type="date" name="birthDate" id="birthDate" /><br />
      <button onclick="yourSign()" id="sendSign" name="sendSign">send</button><br>
      <label for="output" id="output">your sign is: </label><br><input type="text" name="output">
   </form>

2 个答案:

答案 0 :(得分:1)

您的代码中有很多问题需要解决:

第3行:

switch (signDate) {
        case 0:

=>为什么要在日期的字符串表示形式上切换大小写?什么时候应该将其评估为0?

第8-12行:

    var dateFrom = "21/03";
    var dateTo = "20/04";

    var dateFrom = dateFrom.split("/");
    var dateTo = dateTo.split("/");

=>您将dateFromdateTo声明为字符串,然后将它们重新声明为数组(split()函数的结果)。您应该避免这样做,这有点令人困惑。从下面的几行开始,我假设您要命名数组d1d2

第14-16行:

   var from = new Date(d1[2], parseInt(d1[1]) - 1); // -1 because months are from 0 to 11
   var to = new Date(d2[2], parseInt(d2[1]) - 1);
   signDate = new Date(c[2], parseInt(c[1]) - 1);

=> cd1d2未定义。我猜d1d2是日期字符串被拆分的结果(请参见上文)。但是c呢?

第18行:

var signOutput = console.log(signDate > from && signDate < to)

=>您正在将返回的console.log()值设置为signOutput变量。 console.log将内容打印到控制台并返回undefined

答案 1 :(得分:0)

  

“带开关盒的功能未提供输出”

这是XY problem。 OP应该在知道某些事实的情况下解决此问题:

  • 用户输入有两个范围:月: 1到12个数字和天: 1到31个数字。日期API和/或<input type="date">很复杂,不需要年份。 仅需要用户输入2个数字

  • 一个<form>及其形式控件(即<input><select><button>等)可用于约束用户输入,因此可以使用编写以期望获得特定的输入,并且总是期望获得相同的结果。使用来自<input type="date">的数据时,必须考虑是否将其实例化为对象,进行格式化等。尝试 <select>几个月,<input type="number">几天,< / em>

  • jQuery已加载,因此需要考虑某些事项。切勿使用事件属性。 jQuery事件处理功能多样且功能强大,因此请充分利用它。

      

    <button onclick="fnc();" type="button">Done</button>

         

    <button type="button">Done</button> ...
      ... $('button').on('click', fnc);

  • JavaScript是松散类型的,因此请始终注意从一行到另一行的参数是什么。尝试在整个函数中专注于单一类型。用户仅提供2个数字,因此一旦将其从字符串转换为实数,请保持这种方式,直到结果显示给用户为止。


如果switch()必须以相似且有限的方式处理多种可能性,则很有用。如果解决条件导致进一步的条件,请使用if / if...else / else语句。这是演示中提供的switch()的概述:

  • 传递了一个数字:0到11-<select>中代表case MONTH:的索引号。

  • 引用了一个数字:1到31-<input type="number">中代表DAY的数字。

     case MONTH:
       SIGN = DAY < Specific_day ? "sign A" : "signB";
       break;
    
  • 三元组:
    如果 DAY数量 小于 [<] {{ 1}}数字然后 [?] ...
    Specific_day字符串等于 [=] SIGN字符串...
    其他 [:]
    "sign A"字符串等于 [=] SIGN字符串

函数"sign B"通过确保maxDays()的最大值根据月份是正确的,并确保其值不超过最小值1和最大值30、29或30,来调节输入。 31。


input#day
$('#month, #day').on('input', maxDays);
$('button').on('click', zSign);

function maxDays() {
  var num = Number($(this).val());
  var max;

  if ($(this).is('#month')) {
    if (num % 2 === 0) {
      max = 30;
    } else if (num === 1) {
      max = 29;
    } else {
      max = 31;
    }
    return $('#day').attr('max', max).val('1');
  }

  if ($(this).is('#day')) {
    if (num < 1) {
      num = 1;
    } else if (num > max) {
      num = max;
    } else {
      num = num;
    }
    return $('#day').val(num);
  }
  return false;
}

function zSign() {
  var month = Number($('#month').val());
  var day = Number($('#day').val());
  var sign;

  switch (month) {
    case 0:
      sign = day < 21 ? "Capricorn" : "Aquarius";
      break;
    case 1:
      sign = day < 19 ? "Aquarius" : "Pisces";
      break;
    case 2:
      sign = day < 21 ? "Pisces" : "Aries";
      break;
    case 3:
      sign = day < 21 ? "Aries" : "Taurus";
      break;
    case 4:
      sign = day < 21 ? "Taurus" : "Gemini";
      break;
    case 5:
      sign = day < 22 ? "Gemini" : "Cancer";
      break;
    case 6:
      sign = day < 23 ? "Cancer" : "Leo";
      break;
    case 7:
      sign = day < 24 ? "Leo" : "Virgo";
      break;
    case 8:
      sign = day < 23 ? "Virgo" : "Libra";
      break;
    case 9:
      sign = day < 24 ? "Libra" : "Scorpio";
      break;
    case 10:
      sign = day < 23 ? "Scorpio" : "Sagittarius";
      break;
    case 11:
      sign = day < 23 ? "Sagittarius" : "Capricorn";
      break;
    default:
      sign = null;
      break;
  }
  return $('#output').val(sign);
}
:root {
  font: 500 16px/1.3 Verdana
}

select,
input,
output,
button,
label {
  display: inline-block;
  font: inherit;
  margin: 5px 1px;
}

#day {
  width: 4ch;
  text-align: center;
}

#output::before {
  content: "\a0";
}