Ajax Construction Kit: Creating Responsive GUIs with Real-Time Validation
One of the truly killer applications of Ajax is real-time user input validation, which means that data entered by the user is checked for validity as the user enters it. This can dramatically improve the efficiency of user interfaces because errors are caught as they are made, thus eliminating the need to submit an entire form to find out whether a problem exists. Additionally, applications just feel smarter when they give immediate feedback to the user regarding data entry. As it turns out, Ajax isn't technically required for a lot of real-time validation tricks, but it still does play a role in some instances when it is necessary to load data from a server as part of the validation.
This chapter digs into real-time validation and explores when and where it makes sense to inject such functionality into your own applications. You also take a quick break from Ajax to learn how to validate popular data types such as phone numbers, dates, and email addresses. Ajax then comes back into play as you work through a practical example involving ZIP code validation that performs a live look-up of the respective city and state. This is an extremely handy Ajax trick you can use to significantly streamline the entry of location/address information.
The following files are used by the Validator application in this chapter and are located on the live Linux CD-ROM with the book in the chap07 example code folder:
- validator.html—Main Web page
- ziplookup.php—Server script for looking up a city/state based upon a ZIP code
- ajaxkit.js—Core Ajax functions for the Ajax Toolkit
- domkit.js—DOM-related functions for the Ajax Toolkit
- validatekit.js—Validation functions for the Ajax Toolkit
- wait.gif—Animated "loading" icon that is displayed during an Ajax request
The Challenge: Checking User Input in Real Time
The challenge laid down in this chapter is quite broad—improve the retrieval of information from the user by eliminating input errors immediately at the point where they are made. If you use a word processor such as Microsoft Word, which has a real-time spell checker, then you understand how handy this feature can be. In many ways the auto-completion application in the previous chapter can be thought of as roughly similar to a real-time validator. However, auto-complete is more about improving efficiency than it is about correcting mistakes, even though the two tasks often go hand in hand.
To see a practical validator in action, check out Google's Gmail online email service at http://mail.google.com/. The invitation feature in Gmail allows you to send an invitation to a friend to join Gmail. The invitation request requires the email address of your friend, which is what you're supposed to enter in the text box. An improperly formatted email address results in Gmail displaying an "invalid address" message just below the email address text box.
Gmail isn't quite as aggressive with its validation as some Ajax applications, which is evident by the fact that you have to click a Send Invite button before Gmail performs the validation. A more aggressive approach would involve validating the address as soon as the user leaves the email text box. This latter approach is often employed in Ajax applications, and in most cases serves as an improvement because it can head off invalid data entry as soon as it is entered.
The general idea behind a modern approach to user input validation is to eliminate the need for a page reload in order to see if data is valid. In many cases you can eliminate the entire trip to the server and perform the validation entirely within the client. Strictly speaking, if the server isn't involved, the validation isn't truly using Ajax. However, there is a notion of an Ajax "feel" to an application that can still be gained via client-side validation. The challenge in this chapter involves both client-only and true Ajax validation.
Speaking of the challenge, this chapter gets away from accomplishing a central task and instead focuses on demonstrating how to validate several different kinds of user input. Sure, it would've been possible to dream up some example involving numbers, dates, email addresses, phone numbers, and ZIP codes, but the additional overhead would just distract from the real emphasis, validating data. So the challenge in the Validator application is to simply present several user-input text boxes, each associated with a particular data type, and validate each one in real time as the user moves through the user interface.
Following are the data types targeted for validation by the Validator application:
- Phone number
- Email address
- ZIP code
The key to validation isn't just popping up an annoying alert box to let the user know his or her input is bad. In fact, an alert box is the worst way you can go about notifying the user of an input problem. A better approach is to sneakily provide help fields on the form that are invisible unless a validation problem occurs, in which case you display help text for the user. For example, you might display the help text
"Please enter a date (for example, 01/14/1975)."
when the user enters an invalid date. The help text appears when the data is bad and then magically goes away once the data is fixed.
- validateNonEmpty()—Is the data empty?
- validateInteger()—Is the data a valid integer?
- validateNumber()—Is the data a valid number?
- validateZipCode()—Is the data a valid ZIP code?
- validatePhone()—Is the data a valid phone number?
- validateEmail()—Is the data a valid email address?
- validateDate()—Is the data a valid date?
At this point you may be wondering exactly where Ajax fits into the Validator equation, and the answer is that it doesn't... at least not yet. All of the data types targeted by the application can be validated perfectly fine within the client without any assistance from a server. Or at least the format of the data can be validated on the client. ZIP code data is a little unusual because you can validate the format of a ZIP code (exactly five integer numbers, for example) on the client but you won't know if the ZIP code is truly valid in the real world. In other words, is the ZIP code actually in use?
The only way to check for the validity of a ZIP code is to look it up in a database of real ZIP codes to see if it is indeed real. This database would be able to tell you that 90210 is indeed a real ZIP code and that it represents Beverly Hills, CA. As it turns out, such databases already exist and can be accessed via Ajax requests. Even better, most of them can provide you the data in an XML format, making it easy to sort out in your Ajax code. Ajax therefore enters the picture with the Validator application by way of looking up the city and state for a ZIP code to verify that the ZIP code is real.
So now you have a fairly complete validation challenge involving several client-side data validations as well as a true Ajax validation involving ZIP codes and their respective cities and states. You can now turn your attention to the design of the Validator application.