Version 1.7Example Form Validation
API Quick Reference
JavaScript is required to use the quick reference
Have a play with the form below:
HTML
This is the HTML for the form above:
<form action="example.shtml" id="testForm">
<p>
<label for="email">
<span class="question">Email:</span>
<input type="text" name="email" id="email" />
</label>
</p>
<p>
<label for="password">
<span class="question">Password:</span>
<input type="password" name="password" id="password" />
</label>
</p>
<p>
<label for="passwordagain">
<span class="question">Re-enter Password:</span>
<input type="password" name="passwordagain" id="passwordagain" />
</label>
</p>
<p>
<label for="age">
<span class="question">Age:</span>
<input type="text" name="age" id="age" />
</label>
</p>
<fieldset>
<legend class="futurefeatures-msgContainer">
<span class="futurefeatures-prompt">What would you like Glow to do in future?</span> (pick at least two)
</legend>
<p>
<input type="checkbox" name="futurefeatures" id="futurefeatures_timetravel" value="timetravel" />
<label for="futurefeatures_timetravel">Time travel like that car off of Back To The Future</label>
</p>
<p>
<input type="checkbox" name="futurefeatures" id="futurefeatures_terminator" value="terminator" />
<label for="futurefeatures_terminator">Go all liquid metally like that bloke off of Terminator 2</label>
</p>
<p>
<input type="checkbox" name="futurefeatures" id="futurefeatures_daredevil" value="daredevil" />
<label for="futurefeatures_daredevil">Act unconvincingly like that guy off of Daredevil</label>
</p>
<p>
<input type="checkbox" name="futurefeatures" id="futurefeatures_laxative" value="laxative" />
<label for="futurefeatures_laxative">Have a laxative effect</label>
</p>
</fieldset>
<fieldset>
<legend class="stringlength-msgContainer stringlength-prompt">
How long is a piece of string?
</legend>
<p>
<input type="radio" name="stringlength" id="stringlength_tiny" value="tiny" />
<label for="stringlength_tiny">Pathetically tiny</label>
</p>
<p>
<input type="radio" name="stringlength" id="stringlength_modest" value="modest" />
<label for="stringlength_modest">Fairly modest</label>
</p>
<p>
<input type="radio" name="stringlength" id="stringlength_average" value="average" />
<label for="stringlength_average">About average, right guys?</label>
</p>
<p>
<input type="radio" name="stringlength" id="stringlength_massive" value="massive" />
<label for="stringlength_massive">Overwhelmingly massive</label>
</p>
<p>
<input type="radio" name="stringlength" id="stringlength_other" value="other" />
<label for="stringlength_other">Other</label>
</p>
<!-- in a proper form, you'd show / hide this bit depending on the answer above -->
<p>
<label for="stringlength_otherVal">
<span class="question">Other:</span>
<input type="text" name="stringlength_otherVal" id="stringlength_otherVal" />
</label>
</p>
</fieldset>
<p>
And finally, a stupid question because I can't think of a good way to
demo custom form tests...
</p>
<p>
<label for="ageplus50">
<span class="question">Your age + 50:</span>
<input type="text" name="ageplus50" id="ageplus50" />
</label>
</p>
<p><input type="submit" value="Submit" /></p>
</form>
Note this use of class names ending in "-msgContainer" and "-prompt". These are hooks for the default error message output.
JavaScript
The script for creating the form object and adding validation tests:
// create our form
var myForm = new glow.forms.Form("#testForm")
// add tests for email address
.addTests(
"email",
// we don't really need a 'required' check as the 'email' check
// will do that, although we get to provide a different error messsage
["required", {
on: "change submit",
message:"We require your email address for spamming purposes"
}],
["isEmail", {
on: "change submit",
message:"That's no email address!"
}]
)
// add tests for password
.addTests(
"password",
["required", {
on: "idle change submit",
message:"We're very security conscious, enter a password"
}],
["minLen", {
on: "idle change submit",
arg: 5,
message:"Passwords must have a minimum of 5 characters"
}],
["maxLen", {
on: "idle change submit",
arg: 11,
message:"Passwords cannot have more than 10 characters"
}],
["regex", {
on: "idle change submit",
arg: /^[A-Za-z0-9_]+$/,
message:"Passwords can only contain letters, numbers and the underscore character"
}],
// getting fussy...
["regex", {
on: "idle change submit",
arg: /([A-Z].*[0-9]|[0-9].*[A-Z])/,
message:"Passwords must contain at least one uppercase character and number"
}],
["regex", {
on: "idle change submit",
arg: /^[A-Za-z]/,
message:"The first character must be a letter"
}],
["regex", {
on: "idle change submit",
arg: /^[A-Z]/,
message:"The first character must be a letter and uppercase"
}],
["regex", {
on: "idle change submit",
arg: /^G/,
message:"The first character must be a letter and uppercase... and be the letter 'g'"
}]
)
// check passwords match
.addTests(
"passwordagain",
["sameAs", {
on: "change submit",
arg: "password",
message:"Passwords don't match!"
}]
)
// add tests for age
.addTests(
"age",
["required", {
on: "change submit",
message:"Please enter your age"
}],
["isNumber", {
on: "change submit",
message:"Please enter your age as a number"
}],
["range", {
on: "change submit",
arg: "3..120",
message:"Ok, and now your real age please"
}]
)
// add tests for things we'd like glow to do in future...
.addTests(
"futurefeatures",
["minCount", {
on: "submit",
arg: 2,
message:"You need to select at least 2 options"
}]
)
// and finally the ominous string question
.addTests(
"stringlength",
["required", {
message: "Please state the length of string"
}]
)
// how to deal with 'other'.
.addTests(
"stringlength_otherVal",
["is", {
on: "submit",
field: "stringlength",
arg: "other"
}],
["required", {
on: "submit",
message: "Please enter your opinion on the length of the string"
}]
)
.addTests(
"ageplus50",
// require the age field to be filled in
["isNumber", {
on: "change submit",
field: "age"
}],
["custom", {
on: "change submit",
arg: function(values, opts, callback, formData) {
var message = "Nah, try again";
// we assume we're only going to get one value for this field
if (values[0] == Number(formData.age) + 50) {
return callback(glow.forms.PASS, message);
} else {
return callback(glow.forms.FAIL, message);
}
}
}]
)
The examples above are deliberately verbose to show a variety of examples. See a full list of validation tests.
CSS
By default, the error output is unstyled. Here are the styles used on this page:
#testForm .glow-errorMsg {
font-weight: bold;
color: #900;
}
#testForm legend .glow-errorMsg {
display: block;
margin-top: 5px;
}
#testForm .glow-errorSummary {
border-left: 4px solid #b00;
background: #ffa;
padding: 4px 10px;
margin-bottom: 10px;
}