function checkBoxChecked(softid) {
    var formObject = window.document.formobj;
    var length = formObject.all.length;
    if(formObject.softname_check.checked)  {  
       for(i=0;i<length;i++) {  
          if(formObject.all(i).type == "checkbox") {
             formObject.all(i).checked = true ;  
          }  
       }  
    }
    else {  
       for(i=0;i<length;i++) {  
          if(formObject.all(i).type == "checkbox") {  
             formObject.all(i).checked = false ;  
          }  
       }  
    } 
}
这是一个 点击checkbox全选全消的方法用于主checkbox
softid 是传入的副checkbox的id 
  
我现在有几组checkbox分别如下:1    2   3   4   5   6
11   12  13  14  15  16
22   33  44  55  66  77这些都是 动态生成的 有何方法可以点击 1(主checkbox)  后 2 3  4 5 6 的checkbox全选 而 后面不动  、
再点击  11(主checkbox)  则  12  13  14  15  18的 checkbox全选 其他不动 再点击主checkbox 则取消,  后面
再动态生成 则同样。我已经生成了 副checkbox的id  但是 我不知道该如何在js中循环取得 这些 动态id 请支个招 谢谢
这是 php代码  大大赏脸看个 万分感谢 
<div style="width:570px;height:150px;overflow:auto;">
                  {foreach key=k item=i from=$F.Checkbox}
                  {if $i == 'over'} 
                  <br/>
                  {elseif mb_substr($k,0,6) == 'script'}
                  {foreach key=f item=s from=$i}
                  <input type="checkbox" id='softname_check' name="organizationid_soft_check[]" onclick="checkBoxChecked('organizationid{$f|escape}');" value={$f|escape}
                  {foreach key=j item=h from=$F.B.organizationid_soft_check}{if $f == $h}checked{/if}{/foreach}>
                  <span class="txt12">{$s|escape}</span>
                  {/foreach}
                  {else}
                  {foreach key=l item=v from=$i}
                  <input type="checkbox" id="organizationid{$k|escape}" name="organizationid_o_check[]" value={$l|escape}
                  {foreach key=j item=h from=$F.B.organizationid_o_check}{if $l == $h}checked{/if}{/foreach}>
                  <span class="txt12">{$v|escape}</span>
                  {/foreach}
                  {/if}
                  {/foreach}
</div>

解决方案 »

  1.   

    其实很简单,
    有几种做法.
    一种:
     这样布局
     主checkbox <div id='soncheckbox_主checkboxid'>son checkbox组</div>
     点主checkbox以后,拼凑div id,然后找div的子节点,选中或者取消.
    另外一种
     主checkbox ,在其子checkbox name或者id属性中,添加主checkbox的id,这样通过字符串操作,可以分清父子归属,来决定选中或者取消.具体实现自己做吧.
      

  2.   

    大大 我用的就是 
    另外一种 
    主checkbox ,在其子checkbox name或者id属性中,添加主checkbox的id,这样通过字符串操作,可以分清父子归属,来决定选中或者取消.但是 如何 在主checkbox的js中取得子check的id值哪? 需要循环取得的吧  能告知下吗
      

  3.   

    将下列循环对应你的数据集循环显示.
    for(;;)
    {
    if($i > 3) break;
    $html[] = <<<h
    <input type="checkbox" onclick="chks('name_{$i}[]',this.checked)"/>
    h;
    for($j=0;$j<6;$j++)
    {
    $html[] = <<<s
    <input type="checkbox" name="name_{$i}[]"/>
    s;
    }
    $html[] = "<br/>";
    $i++;
    }
    echo implode('',$html);
    echo <<<js
    <script type='text/javascript'>
    var chks = function(name,chked){
      var o = document.getElementsByName(name);
      for(var i=0,j=o.length;i<j;i++){
       o[i].checked = chked;
    }
    }
    </script>
    js;
      

  4.   

    foolbirdflyfirst 已经帮你写出来了,呵呵.
      

  5.   

    谢谢 不过用name的话 取值就不行了 只能用id
      

  6.   

    取什么值?你可以修改下我给你的例子,讲明白下你的问题.
    不要把你那些带smarty语法以及无头无尾的变量的tpl文件贴出来,大家不好帮你测试的.
      

  7.   


    js也可以取name的值啊, 你想怎么取 ?
      

  8.   

    恩确实一般都用id传值 按foolbirdflyfirst 你在改改就可以了~
      

  9.   

    function checkBoxChecked(obj) {
        var formObject = window.document.formobj;
        var length = document.getElementsByName("organizationid_o_check[]").length;
        if(document.getElementById(obj.id).checked==true) {
           for(i=1;i<length+1;i++) {
              document.getElementById(obj.id+"_"+i).checked=true;
           }
        }
        else {  
           for(i=1;i<length+1;i++) {  
              document.getElementById(obj.id+"_"+i).checked=false; ; 
           }  
        } 
    }谢谢大甲虫的帮忙 我改了 因为我的name是个数组 所有使用方法比较局限,为的是提交时可以取得所有的checkbox从而放入数据库,现在还有一个问题 就是  如果 出现多个checkbox 取得的length 数超过了getElementById(obj.id+"_"+i) 这个i的上限 js就会报错  也就是说 如果 只有一条动态checkbox没问题 
    1  2  3  4  5 (此类情况ok)
      
    1  2  3  4  5  
    11  22  33  44  55 (此类情况js出错)虽然点击1 后 能全选 点击 11后11的子box也能全选就是js报错好像是 超过局限了 不知道能不能 支个招  
      

  10.   

    页面元素不多就try..catch,屏蔽错误。
    不过建议你自己捋清楚生成的checkbox节点个数。
      

  11.   

    没法子了 用了 try{}catch{}了 把错误包裹了 因为 只是溢出 不是错误  不知有没有后遗症
      

  12.   

    遇到问题绕着走?虽然不失为好办法,但你并没有换个思路呀!不用 smarty ,所以无法测试。建议你帖出 php 程序输出的 HTML 文档,这样才方便配 js 代码
      

  13.   

    其实是  我有多组动态的checkbox 每组都有一个主box  和不确定数量的子box(根据数据库决定)  这样的话var length = document.getElementsByName("organizationid_o_check[]").length; 
    取得的长度 就不是 一组 而是根据动态checkbox组的整组长度了 所以document.getElementById(obj.id+"_"+i).checked=true; 的i得长度超过该组子box的数量js就会报错 由于是动态生成的,js处理起来比较麻烦, 
    要考虑0个/1个/1个以上的3种情况。 
      

  14.   

    上面的大大要 我就放出了 加点注释后台 方法
    function aGetOrganizationCheckBox($con,&$vo,$aRequest=array()){
            //$_REQUEST["organizationid_o_select"] :生成主checkbox的条件取得
         if($_REQUEST["organizationid_o_select"]) {
                $vo->organizationid_o_select = $_REQUEST["organizationid_o_select"];
             foreach ($vo->organizationid_o_select as $k=>$v) {//有多少主checkbox在这里确定了
                    if ($vo->getNewOrgType()) {//两种情况 不用在意
                        $orglist = $this->oOrganizationBL->aGetOrganizationSelect($con,$v);//循环后取得主box的数据
                        foreach ($orglist as $k_id=>$v_list) {
                          $aRs = $this->oOrganizationBL->aGetOrganizationInfo($con, $k_id);
                          $regist_staff = array_keys($this->userdao->getUserSelectByOrgid($con,$k_id));//如果子box没有东西主box也不用显示了
                          if($regist_staff) {
                              $orgcheckbox['script'.$k_id][$aRs->orgid] = $aRs->orgname;//主box赋值给页面元素
                              foreach ($regist_staff as $m=>$userid) {
                                     $userinfo = $this->userdao->getUserInfo($con,$userid);
                                     $orgcheckbox[$aRs->orgid][$userid] = $userinfo->familyname.$userinfo->firstname;//子box赋值给页面
                                 }
                              $orgcheckbox["over".$k_id] = 'over';//换行用
                          }
                        }
                    }
                    else {
                     // 另一种情况 不过不是循环 进本和上面循环是一样 不用在意
                        $aRs = $this->oOrganizationBL->aGetOrganizationInfo($con, $v);
                        $regist_staff = array_keys($this->userdao->getUserSelectByOrgid($con,$v));
                        if($regist_staff) {
                            $orgcheckbox['script'.$aRs->orgid][$aRs->orgid] = $aRs->orgname;
                            foreach ($regist_staff as $m=>$userid) {
                                $userinfo = $this->userdao->getUserInfo($con,$userid);
                                $orgcheckbox[$aRs->orgid][$userid] = $userinfo->familyname.$userinfo->firstname;
                            }
                            $orgcheckbox[$k] = 'over';
                        }
                    }
             }
             return $orgcheckbox;
         }    
        }
    配合一楼的smarty 代码 就这样出来了 return $orgcheckbox的数组类型是array
      'script59' =>//script是用来判断是否主box
        array
          59 => string '张尉组' (length=9)
      59 => //主box key的子box
        array
          36 => string '张尉' (length=6)
          46 => string '朱贞财' (length=9)
      'over59' => string 'over' (length=4)
      'script60' => 
        array
          60 => string '朱雄组' (length=9)
      60 => 
        array
          38 => string '朱雄' (length=6)
          40 => string '夏远鹏' (length=9)
          44 => string '牛兵伟' (length=9)
          45 => string '贾超超' (length=9)
      'over60' => string 'over' (length=4)
      'script61' => 
        array
          61 => string '顾云峰组' (length=12)
      61 => 
        array
          35 => string '顾云峰' (length=9)
          43 => string '刘夏' (length=6)
          42 => string '成弘毅' (length=9)
          49 => string '高明' (length=6)
      'over61' => string 'over' (length=4)
      'script62' => 
        array
          62 => string '于景泉组' (length=12)
      62 => 
        array
          39 => string '于景泉' (length=9)
          51 => string '姜松林' (length=9)
          41 => string '李芝平' (length=9)
      'over62' => string 'over' (length=4)
      

  15.   

    你搞错了,我不是要你的php代码。你用什么方法生成页面并不重要
    关键在于你的操作是用js在浏览器中完成的。所以只要在浏览器中“查看源代码”得到的html文档就可以了
      

  16.   

    checkBoxChecked这个函数是你点击父checkbox的时候触发的函数对不对,动态生成的子checkbox的个数你在php程序中是可以获取到的对不对,你直接把个数作为第二个参数传给checkBoxChecked函数不就行了
      

  17.   

    不行哦  无论放在哪个数组里 都会成为 checkbox被循环 但是 不跟着 checkbox的数组 又无法识别 还是 用try 算了 谢谢大甲虫 我给分了