Как dandavis комментарий «s указал вне, февраль не всегда есть 28 дней из-за високосные годы. Лучше было бы от создания функции, чтобы выяснить, сколько дней в месяц. К счастью, существует относительно простой способ сделать это с помощью JavaScript. Если вы установите дату в 0
используя либо Date constructor или Date.prototype.setDate, полученного Date
объект будет установлен в последний день предыдущего месяца, с помощью этого можно легко создать функцию, чтобы получить количество дней в месяц.
function getDaysInMonth(month) {
var d = new Date();
d.setMonth(month + 1);
d.setDate(0);
return d.getDate();
}
Эта функция рассчитывает month
равной нулю на основе как Date
конструктора (имеется в виду, что ожидает month
быть числом между 0
и 11
вместо 1
и 12
).
var days = getDaysInMonth(mndminus);
Я также рекомендовал бы использовать другую структуру данных для поиска месяца имени. Вместо того, чтобы перебирать массив из двухэлементных массивов, используйте в качестве словаря объект .
var monthLookup = {
0: "Jan",
1: "Feb",
2: "Mar",
3: "Apr",
4: "Mai",
5: "Jun",
6: "Jul",
7: "Aug",
8: "Sep",
9: "Okt",
10: "Nov",
11: "Des"
};
Затем отрываясь месяц так же просто, как monthLookup[mndminus]
.
С учетом этих изменений ваш код будет выглядеть примерно так:
var getDaysInMonth = function (month) {
var d = new Date();
d.setMonth(month + 1);
d.setDate(0);
return d.getDate();
},
monthLookup = {
0: "Jan",
1: "Feb",
2: "Mar",
3: "Apr",
4: "Mai",
5: "Jun",
6: "Jul",
7: "Aug",
8: "Sep",
9: "Okt",
10: "Nov",
11: "Des"
},
calender = function() {
var tall = parseInt(document.getElementById("box").value, 10),
mndminus;
if (tall >= 1 && tall <= 12) {
mndminus = tall - 1;
document.getElementById("text").innerHTML = monthLookup[mndminus] + " - " + getDaysInMonth(mndminus);
}
},
funkytown = function() {
document.getElementById("button").onclick = calender;
};
window.onload = funkytown;
Вы заметите, что я использовал функцию деклараций вместо заявления функции. This article действительно помогает объяснить, что такое каждый из них, и почему обычно используется практика использования деклараций вместо операторов.
Что-то нужно искать, не забудьте всегда объявлять переменные! Ваш оригинальный код не объявлял i
, что делает его неявным глобальным. Неявные глобальные переменные могут вызывать всевозможные странные ошибки, особенно если это общее имя переменной , например i
, которое, вероятно, будет использоваться в другом месте вашего кода. Кроме того, , если вы используете цикл для поиска массива, вы можете использовать break
statement , чтобы выйти из цикла раньше, как только вы нашли предмет, который ищете. Без a break;
заявление вашего кода проверяет все двенадцать элементов в массиве независимо от того, в каком месяце вы ищите, даже если это январь и найден в первой итерации.
Я бы также рекомендовал учиться использовать JSHint или JSLint, они отличные инструменты, которые помогут вам улучшить код. Они особенно хороши в выявлении распространенных ошибок, таких как неявные глобальные переменные, и сэкономит вам много времени на отладку, указав эти вещи, прежде чем они сводят вас с ума.
Не печатайте длину месяца, это неправильно в следующем году, например. используйте методы объекта Date(), чтобы вычислить количество дней в данном месяце вместо того, чтобы полагаться на словарь. – dandavis
Из-за високосного года? Да, я не должен был принимать это во внимание в этот раз, но спасибо за твоего чувака! Цените это: D – gruffmeister
Вы уже знаете, что происходит не так. В конце концов, вы видели, как это произошло на ваших глазах и решили спросить о переполнении стека. Так почему бы не описать в своем посте, что именно, идет не так? См. [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). (Кроме того, как новый пользователь, вы можете прочитать [вступительный тур] (http://stackoverflow.com/tour).) – usr2564301