2010年3月4日木曜日

ラジオボタンの値の取得

WEBシステムの作成でフォームの中にラジオボタンを配置する時、phpにしろ何にせよその値の取得が非常にめんどくさいと思ったことはないですか?
ラジオボタンは他のコントロールと違い複数のコントロールでセットになっているため、
その値を取得するのにその数分のラジオボタンをチェックしてどれが選択されているかを判断しないといけない。こりゃめんどくさい。

そこで、考えました。

ページのフォームにラジオボタンがあれば、同じnameのものをグループ化して、
GPR_nameという名前でhiddenを作成し、
ラジオボタンの選択値をそのhiddenに設定するものです。
設置はスクリプトを読み込むだけ。

サンプル
スクリプト


//ラジオボタンが存在すれば"radiogroup_"+nameのグループを作成する
//なるべくページの下のほうで読み込みしてください
var radioButtonGroup = new Array();
radio_setup();

/*
if(typeof window.addEventListener == 'function'){ // addEventListenerが使えるなら
 window.addEventListener('load', radio_setup, false);
} else if(typeof window.attachEvent == 'object'){ // attachEventが使えるなら(IE用)
 window.attachEvent('onload', radio_setup);
}
*/
var GP_NAAME_PREFIX="GPR_";
//radioのクリックイベントを追加する。
function radio_setup(){
 var inputs = document.getElementsByTagName("input");
 if(inputs.length>0){
  for(i=0;i<inputs.length;i++){
   if(inputs[i].type=="radio"){
    if(arrayIndexOf(radioButtonGroup,inputs[i].name)<0){
     radioButtonGroup.push(inputs[i].name);
    }
    
    if(inputs[i].addEventListener){
        inputs[i].addEventListener("click",function(){radioclick(this);}, false);
    }else if(inputs[i].attachEvent){
        inputs[i].attachEvent("onclick", function(){radioclick(event.srcElement);});
    }

   }
  }
 }
}



//GroupHiddenを作成する
//hiddenが準備してあればその値を選択反映する。
//準備されていなければ、作成する。

for(j=0;j<radioButtonGroup.length;j++){
 //フォームは1つ限定
 var fm = document.forms[0];
 input=document.createElement("hidden");
 input.id=GP_NAAME_PREFIX+radioButtonGroup[j];
 //hiddenが準備されて値が設定されているとき(値の復元時など)
 var grouphidden=document.getElementById(input.id);
 if(grouphidden){
  radios=fm.elements[ASPnameKusofix+radioButtonGroup[j]];
  for(k=0;k<radios.length;k++){
   if(radios[k].value==grouphidden.value){
    radios[k].checked=true;
   }else{
    radios[k].checked=false;
   }
  }
 }else{
  fm.appendChild(input);
  //初期値の設定
  var rds = fm.elements[radioButtonGroup[j]];
  for(j=0;j<rds.length;j++){
   if(rds[j].checked==true){
    input.value=rds[j].value;
    
   }
  }
 }
}
//クリックイベント(grouphiddenに値を設定する)
function radioclick(radioobj){
 var gobj=document.getElementById(GP_NAAME_PREFIX+radioobj.name);
 gobj.value=radioobj.value;
 //alert(gobj.value);
}
//サブ関数 配列の検索
function arrayIndexOf(ary,value){
 var res=-1;
            for(h=0;h<ary.length;h++){
  
                if( ary[h] == value){
                   res=h;
                }
            }
            return res;
}