テキストボックス, テキストエリア, SELECTボックス, チェックボックス, ラジオボタンなどの、HTMLの入力フォームに値を設定する「いい」方法についてです。 (「いい」というのは私の主観なので、本当にいいかどうかは読んだ方が判断してください)
利用シーンとしては、
などが考えられます。
以下の「sample」SELECTボックスで何か選択すると、選択肢に対応して用意している値が入力されます。 これを実装する場合にあなただったらどう書くか、少し考えてみてください…。
私が紹介・お勧めするのは以下のコードです。「どの要素に何を設定するか」という情報は データと考え、処理とは分離しJSONで表現しています。「$(function() {});」の中身は SELECTボックスを作っている処理です。
なので、記述する処理は実質的には「setValues」の部分だけです。 処理内容はシンプルなので、ソースを見る人も理解しやすいのではないかと思います。
$(function() { // SELECTボックスの中身の作成と選択時の挙動の設定。 for (var key in samples) { $("#samples").append($('<option>').html(key).val(key)); } $("#samples").change(function() { var sample = samples[$("#samples").val()]; setValues(sample); }); }); /** * FORMコントロールへの値の設定 * @param setting 「{key1: value1, key2: value2, ...}」形式のオブジェクト * key :要素を特定するjQueryのセレクタ * value:設定する値 */ var setValues = function(settings) { $.each(settings, function(key, val) { var elm = $(key); if (typeof val === "boolean") { elm.prop("checked", val); } else { elm.val(val); } }); }; // データ。SELECTボックスもこの情報をもとに作成する var samples = { "" : {}, "IDで指定": { "#fullname": "柳 政和", "#male": true, "#skill-Java": true, "#skill-JavaScript": true, "#skill-Ruby": false, "#skill-C": false, "#select": "750", "#multiselect": "東京", "#textarea": "いろいろやってます", }, "nameで指定": { "[name='fullname']": "池澤 彩", "[name='gender']": ["female"], "[name='skill']": ["JavaScript", "Ruby"], "[name='select']": "500", "[name='multiselect']": ["東京","名古屋", "鳥取"], "[name='textarea']": "電子工作もできます", }, "nameで指定2": { "[name='fullname']": "増井 雄一", "[name='gender'][value='male']": true, "#skill-Java": true, "#skill-JavaScript": false, "#skill-Ruby": true, "#skill-C": true, "[name='select']": "1000", "[name='multiselect']": ["東京", "大阪", "博多"], "[name='textarea']": "風呂でもコードを書きます!", }, };
他の人の実装でしばしば見かけるのは、要素のIDと値を引数にとり処理をする関数をつくり、 設定したい入力欄ごとにその関数を呼ぶというものです。そのタイプだと項目が一つ増えるたびに 関数を呼び出す処理を1行追加しなくてはならず、関数化している意味がほとんどないといえるでしょう。
それに対し上記の方法だと、項目が増えた場合にはJSONオブジェクトに対応するデータを 追加するだけでよく、処理の部分は原則的に修正を加える必要がありません。 さらにSELECTボックスもJSONを元に作成するので、選択肢を増やす場合でもHTMLを編集する手間が省けます。
ちなみにsetValuesで「$(key)」を一旦変数に入れているのは、値をセットした後にonchangeやonblurを発生させるなど 将来、拡張しやすくするためです。また、チェックボックスとラジオボタンで、 name属性・value属性がない場合、checkedで値を設定したい場合のためにと 汎用性を高めるためのロジックになっています。それらがなくていいのなら、以下のようなさらにシンプルなコードにできます。
var setValues = function(settings) { $.each(settings, function(key, val) { $(key).val(val); }); };
このケースに限らないことですが、私はプログラムを書く際に処理とデータの分離が重要 だと考えています。この「setValues」はその象徴的ともいえる実装です。
データと処理を分離すれば、処理をシンプルに書けるのでコーディング量が減り、 またバグも減ります。さらに項目追加の際には変更個所が明確なので修正が容易で、 かつ処理に手を加える必要がないのでデグレも減るでしょう。 その代わり、処理とデータを分離するスキルや適切なデータ構造を考えるスキルが必要になりますが、 そこは経験を重ね少しずつ身に付けていけばいいと思います。
ここで紹介した方法は、このサイトの多くのツールでも実装しています。 私の場合、セレクタを書くのが楽なのでID指定で書くことが多いのですが、checkboxの場合はname指定が便利ですね。 入力項目が一つしかない場合はシンプル実装にしていたり、選択項目をグルーピングしているケースやなど いくつかバリエーションがあります。ご興味があればソースをのぞいてみてください。
このページに関するちょっとした感想または、要望、バグ・間違いの指摘などは、下記の送信欄からお送りください。 質問・その他お問合せなど、返信をご希望の方は「こちらのページ」からメッセージをお送りください。
「このページはお役に立ちましたか?」のアンケートと自由メッセージのどちらか一方でかまいません (両方だとよりうれしいです)。お気軽にご利用ください (感想・どんな用途で使用したかなどをいただけると作成・運営の励みになります!)。