2012-04-13 2 views
0

EDIT: Для тех, кто совершает ту же ошибку, я сделал это, задав этот вопрос, пожалуйста, ищите мой исправленный ответ, ниже которого демонстрируется МУЧНОЕ решение для этой проблемы.2 или 4 цифры Дата проверки с заменой строки Javascript

Попытка разрешить пользователю вводить либо 2-значный, либо 4-значный формат даты и разрешить как пройти проверку, но и автокорректировать двухзначный формат с помощью 4-значного эквивалента с предположением, что ведущие 2 цифры должны быть такими же, как и текущие ведущие 2 цифры.

У меня возникли проблемы с функцией javascript replace(). Эта строка:

  input.replace(enteredDate, year); 

не работает должным образом. В контексте рамки spine.js, которую я использую, значение input относится к $(event.target) и, как представляется, является правильным везде, где используется поле input, где должна выполняться проверка. В конечном счете, я хочу заменить исходную строку, найденную в поле ввода, на полностью конкатенированную (которая еще не построена), но на данный момент, как я могу заменить содержимое input (где вход var = $(event.target)) с вар year назначен здесь:

var year = currentYear.charAt(0) + currentYear.charAt(1) + unparsedYear;

Вот полный код функции у меня есть до сих пор, который бросает следующее сообщение об ошибке в ссылке на .replace() линии - Uncaught TypeError: Object [object Object] has no method 'replace'

validateDate: function(event) { 

     var input = $(event.target); 
     var enteredDate = input.val(); 

     input.destroyValidationMessage(); 

     var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{2})|(\d{4})$/; 
     var result = enteredDate.match(pattern); 

     if (result !== null) { 
      var month = parseInt(result[1], 10); 
      var day = parseInt(result[2], 10); 
      var year = parseInt(result[3], 10); 

      var unparsedYear = parseInt(result[3], 10); 
      var unparsedYearStrLength = unparsedYear.toString().length; 
      if (unparsedYearStrLength < 4) { 
       var currentYear = new Date().getFullYear().toString(); 

       var year = currentYear.charAt(0) + currentYear.charAt(1) + unparsedYear; 
       alert('Autocorrected year will be ' + year); 
       input.replace(enteredDate, year); 
      } 

      var date = new Date(year, month - 1, day); 
      var isValid = date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day; 

     } else { 
      input.createValidationMessage('Invalid Date'); 
      input.addClass('invalid'); 
     } 
    } 
+1

Если 'input' является элементом DOM, вы не хотите« заменять »содержимое, а' 'input.val (new_value)', а не фактический элемент 'input'? – Marc

+0

Точно! Спасибо за это - вы должны опубликовать его в качестве ответа, чтобы вы могли получить репутацию. – Brian

+0

см. Ниже. – Marc

ответ

1

Как уже упоминалось в моем c omment выше:

input является DOM элемент, но вы на самом деле хотите, чтобы заменить содержание элемента против самого элемента, так что используйте input.val(new_value) и не фактический input элемент.

Смежные вопросы