通常、Webアプリケーションでは、画面を遷移する場合、サーバから次画面のHTMLを全てロードし、表示します。
この方法では、次画面を表示するための情報が既に存在するような場合でも、サーバへのアクセスが必須となり、ユーザビリティの低下を招きます。
特に、一覧表示←→詳細表示のように、相互の画面を行き来するような場合で、一覧に表示している内容が、非常に件数の多い時や、複雑な検索処理の結果である時は、サーバ側でのキャッシュを活用しなければ、とても使い物にならないアプリケーションを、顧客に提供することになります(こうなってからの性能向上といったら・・・)。
この問題を解決するには、Webアプリケーションのクライアントが、全ての一覧情報を保持し、詳細画面への画面遷移とデータ引き渡しを行うようにします。Javaアプレットを使えば、解決するのですが、この場合もっと多くの問題が発生する可能性があります(Javaのバージョンの問題や、起動時のパフォーマンス。そもそもアプレットを作成するお金や期間の問題など等・・・しつこい?Javaは別に嫌いじゃない、というより得意分野だけど、クライアントで使うのはいろいろ苦労が(笑))。
一番スマートな解決策は、嬉しいことに現在のWebブラウザの実装レベルで実現できます。一つのHTMLドキュメントに複数画面(必要最低限の数)分記述し、これをDOMにより表示を切り替えるようにします。
切替のタイミングで、たとえば一覧中のデータ項目を、詳細画面の項目にコピーしてやれば良いわけです。詳細画面で内容を変更できるような場合は、変更してサーバへ登録(現在の画面を書き換えないでサーバにアクセスする方法は、Webアプリケーションのサーバ通信を参照してください)したら、詳細に表示中のデータを一覧画面にコピーし直します。
但し、一覧画面には再表示機能(またはこれに類する機能)を、必ず付けましょう。どこかの誰かが、表示中のデータを他のクライアントから書き換えている可能性が、必ず存在するからです。
実現方法は至って簡単です。以下のようなHTMLとスクリプトがあれば、完成です。
var currentIndex;
var listTitle = '登録者一覧';
function init() {
document.getElementById('detail').style.display = 'none';
document.title = listTitle;
}
function toDetail(index) {
currentIndex = index;
document.getElementById('name').value =
document.getElementById('name_'+index).value;
document.getElementById('yomi').value =
document.getElementById('yomi_'+index).value;
document.getElementById('seibetu').value =
document.getElementById('seibetu_'+index).value;
document.getElementById('job').value =
document.getElementById('job_'+index).value;
document.getElementById('hobby').value =
document.getElementById('hobby_'+index).value;
document.getElementById('list').style.display = 'none';
document.getElementById('detail').style.display = '';
document.title = document.getElementById('name').value;
}
function toList() {
document.getElementById('name_'+currentIndex).value =
document.getElementById('name').value;
document.getElementById('yomi_'+currentIndex).value =
document.getElementById('yomi').value;
document.getElementById('seibetu_'+currentIndex).value =
document.getElementById('seibetu').value;
document.getElementById('job_'+currentIndex).value =
document.getElementById('job').value;
document.getElementById('hobby_'+currentIndex).value =
document.getElementById('hobby').value;
document.getElementById('detail').style.display = 'none';
document.getElementById('list').style.display = '';
document.title = listTitle;
}
<html>
<head>
<title>登録者一覧</title>
<script type="text/javascript" src="listtodetail.js"></script>
</head>
<body onLoad="init()">
<div id="list">
<table border="1">
<tr>
<th></th>
<th>名前</th>
<th>読み</th>
<th>性別</th>
</tr>
<tr id="line_1">
<td><button onClick="toDetald(1)">詳細</button></td>
<td><input id="name_1" type="text" value="廣井手香奈" /></td>
<td><input id="yomi_1" type="text" value="ひろいでかな" /></td>
<td><input id="seibetu_1" type="text" value="女" />
<input id="job_1" type="hidden" value="デザイナ" />
<input id="hobby_1" type="hidden" value="ペン画" /></td>
</tr>
<tr id="line_2">
<td><button onClick="toDetald(2)">詳細</button></td>
<td><input id="name_2" type="text" value="深山明" /></td>
<td><input id="yomi_2" type="text" value="みやまあきら" /></td>
<td><input id="seibetu_2" type="text" value="男" />
<input id="job_2" type="hidden" value="プログラマ" />
<input id="hobby_2" type="hidden" value="鉄道模型" /></td>
</tr>
<tr id="line_3">
<td><button onClick="toDetald(3)">詳細</button></td>
<td><input id="name_3" type="text" value="科元みか" /></td>
<td><input id="yomi_3" type="text" value="しなもとみか" /></td>
<td><input id="seibetu_3" type="text" value="女" />
<input id="job_3" type="hidden" value="陶芸家" />
<input id="hobby_3" type="hidden" value="バス釣り" /></td>
</tr>
</table>
</div>
<div id="detail">
<table>
<tr>
<th>名前</th><td><input id="name" type="text" value="" /></td>
</th>
<tr>
<th>読み</th><td><input id="yomi" type="text" value="" /></td>
</th>
<tr>
<th>性別</th><td><input id="seibetu" type="text" value="" /></td>
</th>
<tr>
<th>仕事</th><td><input id="job" type="text" value="" /></td>
</th>
<tr>
<th>趣味</th><td><input id="hobby" type="text" value="" /></td>
</th>
<tr><td><button onClick="toList()">一覧</button></td></tr>
</table>
</div>
</body>
</html>
要は、一覧画面をidがlistのdiv要素で、詳細画面をidがdetailのdiv要素でそれぞれ囲み、画面を切り替えるスクリプトの中で、片方を非表示にしてもう片方を表示させているだけです。
document.getElementById('list').style.display = 'none';
document.getElementById('detail').style.display = '';
DOMによるスタイルシートの変更は、あくまで該当要素のインラインスタイルを変更しているので、ベースとなるHTML上ではインラインスタイルの使用は、できるだけさけた方が無難でしょう。
上記のスクリプトでは、画面の切替時に画面のタイトルも変更しています。このような、ドキュメントの属性変更は、DOMを利用すれば簡単にできます。
上のサンプルの実装です。効果のほどを確認してください。
| 名前 | 読み | 性別 | |
|---|---|---|---|
| 名前 | |
|---|---|
| 読み | |
| 性別 | |
| 仕事 | |
| 趣味 | |
※一部Webブラウザでは、上記サンプルの動作が不安定で、不要な罫線が残ったりします。Webブラウザのバグによるものですので、いかんともしがたいのですが、ウィンドウのサイズを変更すると、正しく表示されるようです。