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'); 
        }
    }
  1. 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 use input.val(new_value) and not the actual input element.

Originally posted 2013-11-13 09:49:22.