#javascript #jquery #html #css
#javascript #jquery #HTML #css
Вопрос:
У меня есть функция, которая получает дату и должна возвращать знак в соответствии с датой. например, если один из входных данных равен 15.4.1996
вывод будет Aries
Я проверяю только день и месяц (год не измеряется), но проблема в том, что, к сожалению, я не получаю никаких выходных данных. почему?
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 amp;amp; 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>
Комментарии:
1.
signDate > from amp;amp; SignDate < to
опечатка, чувствительность к регистру — ваша среда IDE должна увидеть это для вас, если вы правильно ее настроили2. Возвращаемое значение будет строкой, но вы сравниваете с числом. Попробуйте использовать
"0"
.3. это
birthDate
неBirthdate
4. @ladyd Откуда
d1
d2
иc
откуда? Или это тоже опечатки?5. Этот код повсюду. Проверьте все имена переменных на орфографию (с учетом регистра!) и обязательно инициализируйте каждое из них, но только один раз!
Ответ №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("/");
=> Вы объявляете dateFrom
и dateTo
как строку, а затем повторно объявляете их как массивы (результат split()
функции). Вам следует избегать этого, это немного сбивает с толку. И я предполагаю, что из следующих строк вы хотели назвать свои массивы d1
и d2
.
Строки 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);
=> c
d1
и d2
не определены. Я предполагаю d1
, что и d2
являются результатом разделения строки даты (см. Выше). Но что насчет c
?
Строка 18 :
var signOutput = console.log(signDate > from amp;amp; signDate < to)
=> Вы устанавливаете возвращаемое значение console.log()
в переменную signOutput . console.log
выводит данные на консоль и возвращает undefined
.
Ответ №2:
«функция с регистром переключения не дает выходных данных»
Это проблема XY. OP должен подходить к этой проблеме, зная определенные факты:
-
Пользовательский ввод имеет два диапазона: месяц: от 1 до 12 чисел и дни: от 1 до 31 числа. API даты и / или
<input type="date">
является сложным, и год не требуется. Требуется только 2 числа от пользователя. -
A
<form>
и его элементы управления формой (например<input>
,<select>
,<button>
, и т.д.) Могут использоваться для ограничения пользовательского ввода, поэтому функции могут быть написаны так, чтобы ожидать определенного ввода и всегда ожидать, что они будут выдавать одни и те же результаты. работая с данными из<input type="date">
одного, необходимо учитывать, создан ли его экземпляр для объекта или нет, форматирование и т. Д. Вместо этого попробуйте a в<select>
течение нескольких месяцев и<input type="number">
дней. -
jQuery загружен, поэтому необходимо учитывать определенные вещи. Никогда не используйте атрибут on-event. Обработка событий jQuery универсальна и мощна, поэтому воспользуйтесь ее преимуществами.
👎
<button onclick="fnc();" type="button">Done</button>
👍
<button type="button">Done</button> ...
... $('button').on('click', fnc);
-
JavaScript свободно типизирован, поэтому всегда помните о том, какие аргументы находятся от одной строки к следующей. Попробуйте сосредоточиться на одном типе во всей функции. Пользователь предоставил только 2 числа, поэтому после преобразования из строки в действительные числа сохраняйте их такими, пока результаты не будут отображены пользователю.
A 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
число меньше, чем [<]Specific_day
Число, то [?] …
SIGN
Строка равна [=]"sign A"
String …
else [:]
SIGN
Строка равна [=]"sign B"
String
Функция maxDays()
регулирует ввод, гарантируя, что значение input#day
maximum является правильным в соответствии с месяцем и что оно никогда не превышает минимального значения 1 и максимального значения 30, 29 или 31.
$('#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";
}
<form id="zodiac">
<label for="month">Month:</label>
<select id="month">
<option value='0' selected>January</option>
<option value='1'>February</option>
<option value='2'>March</option>
<option value='3'>April</option>
<option value='4'>May</option>
<option value='5'>June</option>
<option value='6'>July</option>
<option value='7'>August</option>
<option value='8'>September</option>
<option value='9'>October</option>
<option value='10'>November</option>
<option value='11'>December</option>
</select>
<label for="day"> Day: </label>
<input id="day" type='number' min='1' max='30' value='1'>
<button type='button'>Done</button><br>
<label for="output">Your sign is </label><output id='output'></output>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>