ここには、基本的な入力認証ロジックを持つ登録ウィザードと、 認証エラーのための "twitter" スタイルメッセージボックスがあります:
HTML構造は、スクロールの最小限の設定に、 次の2つの特別な要素を加えたものと原理的には同じです : "twitter style" でエラーメッセージを表示する #drawer および ユーザが現在参照しているページを表示する #status。
<!-- twitter style "drawer" for displaying validation errors -->
<div id="drawer">[ERROR MESSAGE]</div>
<!-- the form -->
<form action="#">
<!-- scrollable root element -->
<div id="wizard">
<!-- status bar -->
<ul id="status">
<li class="active"><strong>1.</strong> Create Account</li>
<li><strong>2.</strong> Contact Information</li>
<li><strong>3.</strong> Finalize</li>
</ul>
<!-- scrollable items -->
<div class="items">
<!-- pages -->
<div class="page">[ Any HTML content ]</div>
<div class="page">[ Any HTML content ]</div>
<div class="page">[ Any HTML content ]</div>
</div>
</div>
</form>
CSSコーディングは、このデモの最も難しい部分です。ここに、全体のデモのスタイリングに使用する scrollable-wizard.cssから取った、最も重要な部 分があります。
/* the root element for scrollable */
#wizard {
overflow:hidden;
position:relative;
}
/* scrollable items */
#wizard .items {
width:20000em;
clear:both;
position:absolute;
}
/* single scrollable item called ".page" in this setup */
#wizard .page {
padding:20px 30px;
width:500px;
float:left;
}
/* validation error message bar. positioned on the top edge */
#drawer {
overflow:visible;
position:fixed;
left:0;
top:0;
ここは、簡単な部分です。自明です。
var root = $("#wizard").scrollable();
ウィザードには、必須フィールドが空白でないことをチェックするだけの、簡単な検証ロジックが含まれています。 それは、li.required 要素内にネストした入力フィールドをチェックし、値を持っているかを確認し ます。空白文字は認められません。適切な検証ロジックを実装したい場合は、 Validator ツールを使用してください。
何をしているかが分るように、多くのコメントを加えております。 効果は非常に有益ですが、"drawer" ロジックは非常に簡単な1行だけである点に注目してください。
// 必要な変数
var api = root.scrollable(), drawer = $("#drawer");
// 検証ロジックは onBeforeSeek コールバック内で行われる
api.onBeforeSeek(function(event, i) {
// 1ステップ戻るので検証の必要はない
if (api.getIndex() < i) {
// 1. 現在のページを取得
var page = root.find(".page").eq(api.getIndex()),
// 2. .. ページ内の全ての必須フィールド
inputs = page.find(".required :input").removeClass("error"),
// 3. .. どれが空か
empty = inputs.filter(function() {
return $(this).val().replace(/\s*/g, '') == '';
});
// 空のフィールドがあれば、その時に
if (empty.length) {
// 引き出しを下にスライド
drawer.slideDown(function() {
// フラッシュ効果に色をつける
drawer.css("backgroundColor", "#229");
setTimeout(function() { drawer.css("backgroundColor", "#fff"); }, 1000);
});
// 空と必須フィールドへCSSクラス名 "error" を追加
empty.addClass("error");
// falseを返してスクロールのシークをキャンセル
return false;
// 全て問題なし
} else {
// 引出しを隠す
drawer.slideUp();
}
}
// ステータスバーの更新
$("#status li").removeClass("active").eq(i).addClass("active");
});
まだ全体の設定に、1つの最適化を行う必要があります。ユーザーが、TABキーを使用してフォームフィールドを 進む場合、隣のタブに進む前にフォームページが検証されていることを確認しなければなりません。 これは、次のJavaScriptで達成することができます:
// if tab is pressed on the next button seek to next page
root.find("button.next").keydown(function(e) {
if (e.keyCode == 9) {
// seeks to next tab by executing our validation routine
api.next();
e.preventDefault();
}
});