2015-09-23 5 views
1

Самый большой JS noob в Великобритании пытается получить дни в месяц, когда вы пишете 1-12 во вход.Получить количество дней с номера месяца

Есть ли какой-нибудь удивительный человек, который может сказать мне, что я делаю неправильно?

JS:

window.onload = funkytown; 

var mnd = [[0, "Jan"], [1, "Feb"], [2, "Mar"], [3, "Apr"], [4, "Mai"], [5, "Jun"], [6, "Jul"], [7, "Aug"], [8, "Sep"], [9, "Okt"], [10, "Nov"], [11, "Des"]]; 

var days = [[0, 31], [1, 28], [2, 31], [3, 30], [4, 31], [5, 30], [6, 31], [7, 31], [8, 30], [9, 31], [10, 30], [11, 31]]; 

function funkytown() { 
    document.getElementById("button").onclick = calender; 
} 
function calender() { 
    var tall = parseint(document.getElementById)("box").value; 
    if(tall >= 1 && tall <= 12) { 
     var mndminus = tall - 1; 

     for(i = 0; i < mnd.length; i++) { 
      if(mnd[i][0] == mndminus) { 
       document.getElementById("text").innerHTML = mnd[i][1] + " - " + days[i][1]; 
      } 
     } 
    } 
} 

HTML:

<input type="number" id="box" max="12" /> 
<input type="button" id="button" value="Trykk" /> 
<span id="text"></span> 

Спасибо!

+1

Не печатайте длину месяца, это неправильно в следующем году, например. используйте методы объекта Date(), чтобы вычислить количество дней в данном месяце вместо того, чтобы полагаться на словарь. – dandavis

+0

Из-за високосного года? Да, я не должен был принимать это во внимание в этот раз, но спасибо за твоего чувака! Цените это: D – gruffmeister

+0

Вы уже знаете, что происходит не так. В конце концов, вы видели, как это произошло на ваших глазах и решили спросить о переполнении стека. Так почему бы не описать в своем посте, что именно, идет не так? См. [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). (Кроме того, как новый пользователь, вы можете прочитать [вступительный тур] (http://stackoverflow.com/tour).) – usr2564301

ответ

1

Вы только заменить эту строку:

var tall = parseint(document.getElementById)("box").value; 

по:

var tall = parseInt(document.getElementById("box").value); 

parseint У вас есть, что должно быть parseInt и ) после getElementById, которая должна быть в конце строки.

Надеюсь, это поможет.


var mnd = [[0, "Jan"], [1, "Feb"], [2, "Mar"], [3, "Apr"], [4, "Mai"], [5, "Jun"], [6, "Jul"], [7, "Aug"], [8, "Sep"], [9, "Okt"], [10, "Nov"], [11, "Des"]]; 
 

 
var days = [[0, 31], [1, 28], [2, 31], [3, 30], [4, 31], [5, 30], [6, 31], [7, 31], [8, 30], [9, 31], [10, 30], [11, 31]]; 
 

 
function funkytown() { 
 
    document.getElementById("button").onclick = calender; 
 
} 
 
function calender() { 
 
    var tall = parseInt(document.getElementById("box").value); 
 
    if(tall >= 1 && tall <= 12) { 
 
     var mndminus = tall - 1; 
 

 
     for(i = 0; i < mnd.length; i++) { 
 
      if(mnd[i][0] == mndminus) { 
 
       document.getElementById("text").innerHTML = mnd[i][1] + " - " + days[i][1]; 
 
      } 
 
     } 
 
    } 
 
} 
 

 
funkytown();
<input type="number" id="box" max="12" /> 
 
<input type="button" id="button" value="Trykk" /> 
 
<span id="text"></span>

1

Как 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, они отличные инструменты, которые помогут вам улучшить код. Они особенно хороши в выявлении распространенных ошибок, таких как неявные глобальные переменные, и сэкономит вам много времени на отладку, указав эти вещи, прежде чем они сводят вас с ума.

+0

Или намного проще «вернуть новую дату (год, месяц, 0) .getDate (), '... только потому, что год ... в любом случае +1, чистый подход. – nelek

+0

@nelek Да, причина, по которой я это делал, была связана с тем, что вам не нужно проходить год в функцию. Если вы уже собираете год и/или хотите иметь возможность установить год вручную, я согласен использовать конструктор 'Date', будет более кратким. –