add to hatena hatena.comment (2) add to del.icio.us (0) add to livedoor.clip (1) add to Yahoo!Bookmark (0) Total: 3

js 一覧表示のチェックボックス関連の制御をまとめたクラス

prototype.jsやjQueryの出現でajaxに限らずJavaScriptでのプログラミングが随分に楽になりました。
今回は検索結果一覧などテーブル内の複数行などに、データ選択用のチェックボックスがつけられているケースで、よく使う制御を簡単に実装できるようにまとめたクラスをprototype.jsをベースに作成してみました。

サンプルはこちらから確認できます

実装した機能

・チェックされた行の背景色を変更する
・全てチェックと全て解除
・チェックされた行のみ表示
・1つでもチェックされているかを確認する
・チェックされている値を取得

実装のルール

チェックボックスを含む親エレメントに任意のクラス名を指定する。
サンプルの例ではtrタグになりますので、
<tr class="任意の名前"> 例:<tr class="check_row">
を指定します。

実装方法

サンプルのhtmlソースを見たほうが早いかもしれませんが、、

1.prototype.js、ctl_checkbox.jsの読み込み

HTML:
  1. <script type="text/javascript" src="/js/prototype/prototype.js"></script>
  2. <script type="text/javascript" src="/js/ctl_checkbox.js"></script>

2.CtlCheckBoxクラスの初期化(親クラス名とチェック時の背景色を指定)

JavaScript:
  1. var ChkCtl;
  2.  document.observe('dom:loaded', function() {
  3.   ChkCtl = new CtlCheckBox('check_row', 'lightyellow');
  4.   ChkCtl.load();
  5.  });

3.各処理の記述
全て選択

JavaScript:
  1. ChkCtl.setAll(1)

全て解除

JavaScript:
  1. ChkCtl.setAll(0)

選択中のみ表示

JavaScript:
  1. ChkCtl.showChecked()

全て表示

JavaScript:
  1. ChkCtl.showAll()

1つでも選択されているかどうかを判断する

JavaScript:
  1. ChkCtl.isChecked()

選択されている値の取得

JavaScript:
  1. ChkCtl.getChecked()

ソースコード:ctl_checkbox.js

JavaScript:
  1. /***
  2. * CheckBox Control
  3. */
  4. var CtlCheckBox = Class.create({
  5.  initialize: function(wrap_class, bgcolor_on){
  6.   this.wrap_class = wrap_class;
  7.   this.bgcolor_on = bgcolor_on;
  8.   this.wrap_styles = $H({});
  9.  },
  10.  load: function(){
  11.   var h = $H({});
  12.   this.wrapElments = $$('.' + this.wrap_class);
  13.   this.wrapElments.each(function(e){
  14.    var chkbox = e.down('input[type="checkbox"]');
  15.    if(chkbox){
  16.     h.set(chkbox.identify(), e.identify());
  17.     chkbox.observe('click', function() {
  18.      this.setColor();
  19.     }.bind(this));
  20.     chkbox.observe('change', function() {
  21.      this.setColor();
  22.     }.bind(this));
  23.     this.wrap_styles.set(e.identify(), e.getStyle('background-color'));
  24.    }
  25.   }.bind(this));
  26.   this.checbox2wrap = h;
  27.   this.setColor();
  28.  },
  29.  showAll: function(){
  30.   this.checbox2wrap.each(function(h){
  31.    $(h.value).show();
  32.   });
  33.  },
  34.  hideAll: function(){
  35.   this.checbox2wrap.each(function(h){
  36.    $(h.value).hide();
  37.   });
  38.  },
  39.  onAll: function(){
  40.   this.checbox2wrap.each(function(h){
  41.    $(h.key).checked = true;
  42.   });
  43.   this.setColor();
  44.  },
  45.  offAll: function(){
  46.   this.checbox2wrap.each(function(h){
  47.    $(h.key).checked = false;
  48.   });
  49.   this.setColor();
  50.  },
  51.  setAll: function(checked){
  52.   this.checbox2wrap.each(function(h){
  53.    $(h.key).checked = checked;
  54.   });
  55.   this.setColor();
  56.  },
  57.  setColor: function(){
  58.   if(!this.bgcolor_on) return;
  59.   this.checbox2wrap.each(function(h){
  60.    var chk = $(h.key);
  61.    if(chk.checked){
  62.     $(h.value).setStyle('background-color:' + this.bgcolor_on);
  63.    }else{
  64.     $(h.value).setStyle('background-color:' + this.wrap_styles.get(h.value));
  65.    }
  66.   }.bind(this));
  67.  },
  68.  showChecked: function(){
  69.   this.checbox2wrap.each(function(h){
  70.    var chk = $(h.key);
  71.    if(chk.checked){
  72.     $(h.value).show();
  73.    }else{
  74.     $(h.value).hide();
  75.    }
  76.   });
  77.  },
  78.  isChecked: function(){
  79.   var ret = false;
  80.   this.checbox2wrap.each(function(h){
  81.    var chk = $(h.key);
  82.    if(chk.checked){
  83.     ret = true
  84.     return;
  85.    }
  86.   });
  87.   return ret;
  88.  },
  89.  getChecked: function(){
  90.   var ret_arr = [];
  91.   this.checbox2wrap.each(function(h){
  92.    var chk = $(h.key);
  93.    if(chk.checked){
  94.     ret_arr.push(chk.value);
  95.    }
  96.   });
  97.   return ret_arr;
  98.  }
  99. });

関連するその他の記事

Comments

Leave a Reply