とあるプロダーツプレイヤーの徒然日記

とあるプロダーツプレイヤーが徒然なるままによしなし事をそこはかとなく書きつくろいます

div等で囲まれたチェックボタンをクリックする

概要

業務でdivで囲まれたチェックボタンを作る機会があり、 うまくチェックマークつけられず軽く調べたので、それのメモを書きます。

問題

下記のような実装だと、写真の赤い位置を押しても、チェックマークは消えません。 ※「さしすせそ」の部分を押したらチェックマークはつく

<div class="sample-div">
  <input class="" name="sample" id="sample-id" type="checkbox" value="1">
  <label class="text" for="sample-id">さしすせそ</label>
</div>

f:id:yamadagenki:20151222145818p:plain:w300

いろいろ試行錯誤した結果、htmlだけではきつそうなので、諦めてjavascriptを使うことにしました。

Javascriptで作りこむ

ジョブメドレーrailsでできているので、CoffeeScriptで実装していきます。 $(e.currentTarget).children('input[type=checkbox]')でdivに囲まれたチェックボックス要素を取得しています。

$('.sample-div').on 'click', (e) =>
      e.preventDefault()
      $target = $(e.currentTarget).children('input[type=checkbox]')
      $target.prop('checked', true)

※ prop参考リンク jQueryにおけるattrとpropの違いと使いドコロまとめ - Qiita jQueryで全選択・全解除はprop使う - Qiita

このままじゃToggleの挙動にならない

このままだと、チェックマークを外せないので、チェックボックスとしてそもそも機能しない。 そのため、下記の用に$target.prop('checked')で状態を取得し、その反対の値を返せば良い。 ※分岐を書くほどでもないので、これで対応したという話

$('.sample-div').on 'click', (e) =>
      e.preventDefault()
      $target = $(e.currentTarget).children('input[type=checkbox]')
      $target.prop('checked', !$target.prop('checked'))

これで、div要素をクリックすればチェックマークがつくようになります。

終わりに

なにかもっといい方法あったら教えていただけると嬉しいですm( )m