このようにした場合、入力フォームの次画面である「内容確認画面」に「戻って修正」ボタンを設置しhistroy.backで単純に戻るという仕様にしたとき、以下のfunctionは動作しないために有効化/無効化がなされず、初期値である無効状態となってしまします。
どのような手を加えることで、history.back時もテキストボックスの有効化/無効化ができるでしょうか。
(「戻って修正」でpostによる値の受け渡しをすれば実現はできるでしょうけど、今回はhistory.backおよびブラウザの戻るボタンを前提に考えております)
宜しくお願いします。
jquery
$('#test_chk').on('change',function(){
var chk = $(this).prop('checked'),
obj = $('#test_input');
(chk) ? obj.prop('disabled',false) : obj.prop('disabled',true) ;
});
html
<input name="" type="checkbox" value="" id="test_chk" />
<label for="test_chk">chk1</label>
<input name="" type="text" id="test_input" disabled="disabled" />
チェックボックスの状態を、ページのロード完了時にもすれば良いだけじゃん、と思ったのですが、さにあらず。
別のページから history.back して戻ってきたときに、this が指している要素の checked が true にならない。
Firebug の DOM インスペクタでは checked が true になっていたので、試しに getElementById を使ってみると、何故か正しく状態が取得できました。
こんな感じ(元のコードをなるべく残してます)。
function control_input() { // var chk = $(this).prop('checked'), var chk, obj = $('#test_input'); chk = document.getElementById(this.id).checked; // ★これ! (chk) ? obj.prop('disabled',false) : obj.prop('disabled',true) ; } $(function() { $('#test_chk').on('change', control_input); control_input(); // ロード時にも呼んでやる });
因みに、こうすれば良いはずだ、と最初に思ったものがこちら。
function control_input() { var chk = $(this).prop('checked'), obj = $('#test_input'); (chk) ? obj.prop('disabled',false) : obj.prop('disabled',true) ; } $(function() { $('#test_chk').on('change', control_input); control_input(); // ロード時にも呼んでやる });
履歴で戻ってくると、$(this).prop('checked') が undefined 。
this.checked も同様に undefined。
タイミングの問題かもと思って、setTimeout しても同じだし、試しにボタンを作って、その click から呼んでみても同じ。
見た目はチェックが入っているのに...
ありがとうございました。
2014/02/21 11:35:41大変助かりました。