入力フォームにて、あるチェックボックスにチェックをしたときのみテキストボックスが有効化されるという動作を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" />

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/21 11:35:56
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント200pt

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

id:kon39392

ありがとうございました。
大変助かりました。

2014/02/21 11:35:41
  • id:Lhankor_Mhy
    うーん?
    control_input() 中の $(this)って ロードイベント時には windowオブジェクトでは?
  • id:a-kuma3
    >control_input() 中の $(this)って ロードイベント時には windowオブジェクトでは?

    あ、ああ  (x_x)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません