2 or 4 Digit Date Validation with Javascript String Replacement-Collection of common programming errors
EDIT: To anyone making the same mistake I did in asking this question, please look for my amended answer below which demonstrates a MUCH cleaner solution to this problem.
Trying to permit user entry of either 2 digit or 4 digit date format and allow both to pass validation but autocorrect the 2 digit format with the 4 digit equivalent with the assumption that the leading 2 digits should be the same as the current leading 2 digits.
I’m having trouble with the javascript replace()
function. This line:
input.replace(enteredDate, year);
is not working as expected. In the context of the spine.js
framework I’m using, the input
refers to $(event.target)
and appears to be correct everywhere else in manipulating the input
field where the validation should be occurring. Ultimately, I want to replace the original string found in the input field with the fully concatenated one (which I haven’t built out yet), but for now, how can I replace the contents of input
(where input is var = $(event.target)
) with the var year
assigned here:
var year = currentYear.charAt(0) + currentYear.charAt(1) + unparsedYear;
Here is the full code for the function I have so far, which is throwing the following error in reference to the .replace()
line – 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');
}
}
-
As mentioned in my comment above:
input
is a DOM element, but you actually want to replace the content of the element vs. the element itself, so useinput.val(new_value)
and not the actualinput
element.
Originally posted 2013-11-13 09:49:22.