BugHunt - Ошибка синтаксического анализа Javascript? - PullRequest
0 голосов
/ 23 апреля 2009

людей в сети!

Может быть, один из вас обнаружит, что что-то не так в следующей функции: Это функция javascript, используемая в событии onblur на стороне клиента для проверки того, что введенный текст представляет правильно отформатированную и действительную дату.

Я пробовал несколько раз, и это сработало, но кажется! должен был испробовать все даты!

он будет работать для всех допустимых комбинаций, но он не может анализировать "08" и "09", которые всегда анализируются как 0. Я попробовал это и в IE, и в Firefox, и результат тот же, и консоль javascript FF не находит синтаксическую ошибку в коде.

Кто-нибудь хочет попробовать меня перехитрить? Я оставил в коде предупреждения, чтобы проверить значения моих переменных в критических точках, и мне все кажется нормальным, вплоть до анализа, если у меня есть 08 или 09, в части дня или месяца ...

Используемая функция следующая.

function DateVal(controle, culture, bToday)
{
    //var strDate = controle.value;
    var separateur = '';
    var dayPart = '';
    var monthPart = '';
    var yearPart = '';
    var tblParts;
    var isBisexuel = false;
    var valid = true;

    //alert('DateVal : Controle: ' + controle + 'Controle.value.length: ' + controle.value.length +  ' value: ' + controle.value  + ' culture: ' + culture);
    if (controle.value.length == 10)

    {
        if (culture == 'en-US') 
        {// Il s'agit d'un format de date avec séparateur "/", MM/dd/yyyy
            separateur = '/';
            dayPart = 1;
            monthPart = 0;
            yearPart = 2;
        }
        else if (culture == 'en-GB')
        {// Il s'agit d'un format de date avec séparateur "/", dd/MM/yyyy
            separateur = '/';
            dayPart = 0;
            monthPart = 1;
            yearPart = 2;
        }
        else if (culture == 'fr-CA')
        {// Il s'agit d'un format de date avec séparateur "-", yyyy-MM-dd
            separateur = '-';
            dayPart = 2;
            monthPart = 1;
            yearPart = 0;
        }
        else
        {
            valid = false;
            alert('Le contrôle est mal initialisé (pas de culture ou culture invalide); il n\'y a rien qui va marcher...');
            //window.event.returnValue =false;
        }
    }
    else
    {
        alert('longueur pas valide');

        valid = false;
    }
    if (valid == true)
    {
        alert('valeur: ' + controle.value + ' separateur: ' + separateur);
        tblParts = controle.value.split(separateur);
        alert('yavant parse: dayPart: ' + tblParts[dayPart] + 'monthPart: ' + tblParts[monthPart] +  ' yearPart: ' + tblParts[yearPart]);
        if (tblParts.length == 3)
        {
            dayPart = parseInt(tblParts[dayPart]);
            monthPart = parseInt(tblParts[monthPart]);
            yearPart = parseInt(tblParts[yearPart]);

            alert('après parse: pos0: ' + dayPart + 'pos1: ' + monthPart +  ' pos2: ' + yearPart);

            if (isNaN(dayPart) || isNaN(monthPart) || isNaN(yearPart))
            {
                //alert(dayPart + ' ' + monthPart + ' ' + yearPart);
                valid = false;
            }
            else
            {
                isBisexuel = ((yearPart % 400 == 0) || (yearPart % 4 == 0 && yearPart % 100 != 0));
                alert(isBisexuel);
                if (isBisexuel)
                {
                    tblDays = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                }
                else
                {
                    tblDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                }

                if (monthPart <= 12 && monthPart > 0)
                {
                    if (dayPart > tblDays[monthPart] || dayPart < 1)
                    {
                        alert('le jour fitte pas');
                        valid = false;
                    }
                }
                else
                {
                    alert('mois égal à 0 ou moins, ou supérieur à 12');
                    valid = false;
                }
            }
        }
        else
        {
            alert('le split donne pas 3 morceaux?');
            valid = false;
        }
    }
    //window.event.returnValue = valid;
    if(valid)
    {
        return;
    }
    else
    {
        if (bToday == true)
        {
            var dt = new Date();
            dayPart = dt.getDate();
            if (dayPart.toString().length == 1)
                dayPart = '0'+dayPart;
            monthPart = dt.getMonth();
            if (monthPart.toString().length == 1)
                monthPart = '0'+monthPart;
            yearPart = dt.getFullYear();
            //alert(dayPart + ' ' + monthPart + ' ' + yearPart + ' ' + culture);
            switch (culture)
            {
                case 'fr-CA':
                    controle.value = yearPart + separateur + monthPart + separateur + dayPart;
                    break;
                case 'en-US':
                    controle.value = monthPart + separateur + dayPart + separateur + yearPart;
                    break;
                case 'en-GB':
                    controle.value = dayPart + separateur + monthPart + separateur + yearPart;
                    break;
            }
            //alert(controle.value);
        }
        else
        {
            controle.value = '';
        }
    }
}

Спасибо всем, кто пытался! Pascal

1 Ответ

3 голосов
/ 23 апреля 2009

Необходимо указать параметр radix как 10, в противном случае значения, начинающиеся с 0, анализируются как восьмеричные. Например:

dayPart = parseInt(tblParts[dayPart], 10);
...