Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Автодополнение даты в текстовом поле


Автор: Galina 27.6.2005, 15:29
Как сделать, чтобы в текстовое поле txtDate, в которое должна вводиться дата, писать только две первые цифры (день), а месяц и год подставлялись текущие (автоматически).

В файле dato.js находится функция getDateInstance(strDate)

Код
<HTML>
<HEAD id="Heading">
<title id="PageTitle">Page1</title>
<script language="javascript" type="text/javascript" id="datoScript" src="dato.js"></script>
</HEAD>
</HTML>


Код вызова

txtDate.Attributes["onChange"] = "this.value = getDateInstance(this.value);";

В таком виде это не работает

Спасибо
Галина


PS
Код
function getDateInstance(strDate){
    if(strDate == null) return '';
    var nStringLength = strDate.length;
    if(nStringLength == 0) return '';
    var arrDate;
    
    if ((strDate.indexOf('-') > -1) && (strDate.indexOf('.') > -1))
        return '';
    
    if (strDate.indexOf('-') > -1)
        arrDate = strDate.split("-");
    else
        arrDate = strDate.split(".");
    
    var nArrLength = arrDate.length;
    if(nArrLength > 3) return '';
    var nDay = -1;
    var nMonth = -1;
    var nYear = -1;
    
    var d = new Date();
    var nCurrentDay = d.getDate();;
    var nCurrentMonth = d.getMonth() + 1;
    var nCurrentYear = d.getFullYear();

    if (strDate.indexOf("/") > -1) return '';
    
    if(nArrLength == 1) {
        if(nStringLength > 2 && nStringLength % 2 != 0) return '';
        nDay = parseInt(nStringLength <= 2 ? strDate : (parseInt(strDate.substr(0,1)) == 0) ? strDate.substr(1, 1) : strDate.substr(0, 2));
        if(nStringLength > 2) nMonth = parseInt((parseInt(strDate.substr(2,1)) == 0) ? strDate.substr(3,1) :strDate.substr(2,2));
        if(nStringLength > 4) nYear = parseInt(strDate.substr(4));
    }
    else {
        var strD = arrDate[0];
        nDay = parseInt(strD.length == 1 ? strD : (parseInt(strD) == 0 ? strD.substr(1,1) : strD));
        
        var strM = arrDate[1];
        nMonth = parseInt(strM.length == 0 ? -1 : (strM.length == 1 ? strM : (parseInt(strM) == 0 ? strM.substr(1,1) : strM)));
        
        if(nArrLength == 3){
            var strY = arrDate[2];
            nYear = parseInt(strY.length == 0 ? -1 : (strY.length == 1 ? strY : (parseInt(strY.substr(0,1)) == 0 ? strY.substr(1) : strY)));
        }
    }
    if(nDay == 0 || nDay > 31) return '';
    if(nMonth == -1) {
        nMonth = nCurrentMonth;
    }
    else if(nMonth == 0 || nMonth > 12) return '';
    
    var bSet = false;
    
    if (nYear < 100){ 
        if (nYear + 2000 == nCurrentYear){
            if (nMonth == nCurrentMonth && nDay >= nCurrentDay){
                nYear += 2000;
                bSet = true;
            }
            if ((nMonth > nCurrentMonth) && !bSet){
                nYear += 2000;
                bSet = true;
            }
        }
        if ((nYear + 2000 > nCurrentYear) && !bSet){
            nYear += 2000;
        }
    }
    
    if(nYear == -1)
        nYear = nCurrentYear;
    
    if(!isValidDate(nDay, nMonth, nYear)) return '';
    return dateToString(nDay, nMonth, nYear);
}

Автор: diam 28.6.2005, 07:28
Galina, используй кнопку Код

Для начала, заменим
Цитата(Galina @ 27.6.2005, 15:29)
txtDate.Attributes["onChange"] = "this.value = getDateInstance(this.value);";

на
Код

if ( txtDate.addEventListener ) txtDate.addEventListener("change", function a  (evt)  {evt.target.value = getDateInstance(evt.target.value);}, false);
else txtDate.attachEvent("onchange", function a  (evt)  {event.srcElement.value = getDateInstance(event.srcElement.value); });


Я надеюсь, что функция getDateInstance() работает, потому что я её не смотрел smile

Автор: Galina 28.6.2005, 10:42
Большое спасибо за ответ, но, вставив этот код, я получила сообщение о нескольких синтаксических ошибках - скобки и function a .
Пожалуйста, как мне их исправить?

Спасибо
Галина

Автор: diam 28.6.2005, 12:31
Да, извиняюсь, пофиксил. Теперь работает (правда, я так и не знаю, работает ли функция getDateInstance() или нет, я вместо неё свою подставил. См. ниже).
Код

function getDateInstance ( par ) {
        return par + ' -- добавка -- ';
}

Автор: Sardar 28.6.2005, 22:14
Просто создали новый обьект Date, можно даже заплнить второй, тогда ещё проверка на ошибки будет:
Код
<script type="text/javascript">
function fullDate(str) {
  var ret;
  if((ret=/^\s*([0-9]+)\s*$/.exec(str))==null||isNaN(ret=parseInt(ret[1]))||ret>31) return "";
  var d=new Date();
  var en=new Date(d.getYear(), d.getMonth(), ret);
  return en.toLocaleDateString(); //здесь форматируем дату, используй что угодно
}
</script>

<input id="dat" type="text" onchange="this.value=fullDate(this.value)" />

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)