入力できないけど送信はできるフォームコントロールを作る
2年待ちわびたサガ2015もとい『サガ スカーレット グレイス』を嬉々として予約した kagata です。
さて、今回は最近身近で話題にのぼった HTML の小技をお送りします。
disabled なフォームコントロールは値を送信しない
あるとき、チームメンバーから「入力できないようにしたフォームコントロールの値が送信されないようだ」という話を聞きました。そのフォームコントロールには、以下のように disabled 属性がつけられていました。
<!-- 入力できないし送信もされないテキスト入力欄 -->
<input type="text" name="character" value="ウルピナ" disabled>
<!-- 入力できないし送信もされないプルダウンメニュー -->
<select name="characters" disabled>
<option>レオナルド</option>
<option>タリア</option>
<option>バルマンテ</option>
</select>
調べてみると、MDN にもその旨の記述がありました。
無効状態のコントロールの値はフォームとともに送信しません。
disabled なフォームコントロールの値を送信してゴニョゴニョしようと思ったことが今までなかったもので、そんなことを考えたこともなかったのですが、たしかに disabled というからには値を送信する機能も無効化されてしかるべき、なのかもしれません。
入力できないけど送信はできるフォームコントロールを作る
ではユーザーからの入力は受け付けないけれど、値の送信はできるようなフォームコントロールはどうやって作るのか。調べてみました。
input ないし textarea 要素の場合
input や textarea の場合は簡単で、 disabled 属性でなく readonly 属性をつけてやれば OK です。 “read only” とはいうものの、 POST や GET はできるということですね。
<!-- 入力できないけど送信はできるテキスト入力欄 -->
<input type="text" name="character" value="ウルピナ" readonly>
select 要素の場合
select 要素には readonly 属性がないため、 input 要素と同じようにはいきません。そこで、配下の option 要素のうち選択された状態で固定したいものに selected 属性、それ以外に disabled 属性をつけてやります。
<!-- 入力できないけど送信はできるプルダウンメニュー -->
<select name="characters">
<option selected>レオナルド</option>
<option disabled>タリア</option>
<option disabled>バルマンテ</option>
</select>
コードに若干強引な感じが出ています。また、 select 要素ごと disabled するとメニュー自体開けなくなるのに対してこちらはメニューを開くことができるという違いもありますが、まあこれで OK とします。
出典:HTMLのSelectタグやInputタグのRadioボタンをReadOnlyにする方法
結び
ユーザーからの入力は受け付けないけれど、持っている値は送信できるようなフォームコントロールを作る方法をまとめました。
ユーザビリティを考えると、こういうものが必要になることは実はあんまりないんじゃないか…という気もしますが、何かのときにお役立てください。
