人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

入力フォームにて、あるチェックボックスにチェックをしたときのみテキストボックスが有効化されるという動作をjQueryで以下のように実装した場合の質問です。

このようにした場合、入力フォームの次画面である「内容確認画面」に「戻って修正」ボタンを設置し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" />

●質問者: kon39392
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●200ポイント ベストアンサー

チェックボックスの状態を、ページのロード完了時にもすれば良いだけじゃん、と思ったのですが、さにあらず。
別のページから 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 から呼んでみても同じ。
見た目はチェックが入っているのに...


kon39392さんのコメント
ありがとうございました。 大変助かりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ