フォーム・保存(Submit)・元に戻す(Reset)を組み込んだajaxを利用したフォームアプリケーションを製作した時のメモ。
元に戻すボタンを押すと保存前(読み込み後に保存していない場合は読み込み時)の値にリセットしようと考えていたのですが、本来のリセットボタンは$(selector).val()
で上書きしようとしても初期値として適用してくれません。
動作はjQuery 1.11.2で確認
コード中のselector
はフォーム部品のセレクタを意味します。
15/10/01追記
全フォーム部品に対応したまとめを作成しました。
【jQuery】フォーム部品のリセット初期値を変更する(まとめ)
前提:$(selector).val()
VS $(selector).attr("value")
jQueryでinputの値を取得・変更する際に$(selector).val()
を使うべきか$(selector).attr("value")
を使うべきかの問題はよくある話で、こちらにも投稿があります。
一般には$(selector).val()
の方が良いです。
本題:<input type="reset">
の問題点
フォームを簡単に初期値(value属性に指定されていた値)にリセットできる<input type="reset">
はフォームのコーディングによく利用されますが、JavaScriptで書き換えた値も元に戻されてしまうという問題点がありました。(フォームをまっさらにする「クリア」については別記事を参照してください。)
リセットの初期値ごと変更するには
ここで$(selector).attr("value")
を利用します。
保存(ajaxで送信)する時に同時にattrでvalue属性を書き換えると、リセットボタンを押した時に保存時の値に戻ります。
サンプルコード(初期値変更のみ)
<!DOCTYPE html>
<html>
<head>
<script src="jquery-1.11.2.js"></script>
<script src="script.js"></script>
</head>
<body>
<form>
<input type="text" id="input" value="A">
<input type="reset" value="Reset">
<button id="set_val">Set value to B</button>
<button id="set_attr">Set attribute to B</button>
</form>
</body>
</html>
$(function(){
$("#set_val").click(function(){
$("#input").val("B");
return false;
});
$("#set_attr").click(function(){
$("#input").attr("value", "B");
return false;
});
});
フォームには初期値としてAが設定されています。
Set value to Bをクリックするとフォームの値がBに変わりますがResetでAに戻ってしまいます。
Set attribute to Bをクリックすればvalue属性をBに変えてくれるのでReserをクリックするとBに変化します。
ただし、前述のリンクに書かれている通り、Set attribute to Bで変更されるのはvalue属性値だけなので見た目は変化しません。
見た目(実際のvalue)を変化させるためには$(selector).val()が必要なので注意してください。
補足
検証したところ
ロード→#set_val ⇨ valが変化(当然)
ロード→#set_attr ⇨ valも変化
ロード→#set_val→#set_attr ⇨ valは変化しない
となるようです。
attrを変更した時にvalが伴うのはロードしてから一度もvalをいじってない時限定みたいですね。