如何勾选父子结点之间的关系以及如何

父子联动Checkbox选择
本文介绍了一种实现父子Checkbox联动的方法,通过ID匹配实现选中状态的传递。子Checkbox被选中时,其父Checkbox也会自动选中,反之亦然。

<html>
<head>
<title>父级同选</title>
</head>
<script>
//这次写的父子联动的方法中,主要用到了id的技巧。父id和子id是有规律的,子id永远在父id的基础上进行拼接。所以直接用indexOf进行查找判断就行。
function autoSelect(canId)
{
  var current=document.getElementById(canId);
  var zfjc=document.getElementsByName("zfjcx");
  for(var i=0;i<zfjc.length;i++)
  {
   var jxcId=zfjc[i].id;
   if(canId.indexOf(jxcId)!=-1||jxcId.indexOf(canId)!=-1)       //选中一个的时候,连带父节点也要选中,所以两种情况都得考虑
      {
     if(current.checked==true)
  {
   alert(canId);
   zfjc[i].checked=true;
  }
     else
   {
     if(jxcId.indexOf(canId)!=-1)           //不勾选子节点的时候,直接把子节点去掉,其他都不用去的。
     {
     alert('---------')
      zfjc[i].checked=false;
     }
   }
   }
   }
}


//从上一个页面得到已经勾选的值,在列表中也要展现出来,即把上面勾选过的在这个列表中都展现出来
 function yiXuan()
 {
  var yuanId="1__3";     //假设这是前面获取到的拼接的id
  var geId=yuanId.split("__");

  var jcxArray=document.getElementsByName("zfjcx");

  for(var i=0;i<jcxArray.length;i++)
  {

    for(var j=0;j<geId.length;j++)
 {
     var yx="no";
  if(geId[j]!='')
  {
    yx="jcx"+geId[j];
  }
     var jcx=jcxArray[i].id;
  if(jcx.indexOf(yx)!=-1)           //在表单中id提前就做好命名规则,在这里可以直接用包含不包含来获取
  {
      jcxArray[i].checked=true;
  }
   }
 }

}

</script>
<body>
<table>
   <tr>
      
        <td align="right" class="td_05"><p class="xh">1</p></td>
        <td><input name="zfjcx" id=sjxfl_fenlei1 type="checkbox" onClick="autoSelect(this.id)"></input>一、依法取得有关安全生产行政许可的情况。</td>

       </tr>
     </table>
            <table  width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="tree_tab3">
       <tr>
        <td align="right" class="td01"><img src="http://images.cnblogs.com/16B/menu_arrow.png" align="absmiddle" /></td>
        <td><input name="zfjcx" id="sjxfl_fenlei1>bm1" type="checkbox" onClick="autoSelect(this.id)"></input>1.1、依法取得有关安全生产行政许可</td>
       </tr>
     </table>
            <table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="tree_tab3" id="jcx01" style="display:block;">
       <tr>
        <td class="td02" align="right"><img src="http://images.cnblogs.com/16B/tree/tree_doc.gif" align="absmiddle" /></td>
        <td><input name="zfjcx" id="sjxfl_fenlei1>bm1>jcx1" type="checkbox" onClick="autoSelect(this.id)" value=1></input><a href=http://192.168.3.101:9000/cgi-bin/publish/iportal?u=http://192.168.3.101:9217/jianchaxiang/jianchaxiangneirong/1.html> 生产、经营、运输、储存、使用危险物品或者处置废弃危险物品的,由有关主管部门依照有关法律、法规的规定和国家标准或者行业标准审批并实施监督管理。</a></td>

       </tr>
      </table><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="tree_tab3" id="jcx01" style="display:block;">
       <tr>
        <td class="td02" align="right"><img src="http://images.cnblogs.com/16B/tree/tree_doc.gif" align="absmiddle" /></td>
        <td><input name="zfjcx" id="sjxfl_fenlei1>bml>jcx2" type="checkbox" onClick="autoSelect(this.id)" value=2></input><a href=http://192.168.3.101:9000/cgi-bin/publish/iportal?u=http://192.168.3.101:9217/jianchaxiang/jianchaxiangneirong/2.html> 国家对危险化学品经营销售实行许可制度。经营销售危险化学品的单位,应当依照本办法取得危险化学品经营许可证(以下简称经营许可证),并凭经营许可证依法向工商行政管理部门申请办理登记注册手续。未取得经营许可证和未经工商登记注册,任何单位和个人不得经营销售危险化学品。</a></td>
       </tr>
      </table><table  width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="tree_tab3">
       <tr>
        <td align="right" class="td01"><img src="http://images.cnblogs.com/16B/menu_arrow.png" align="absmiddle" /></td>
        <td> <input name="zfjcx" id="sjxfl_fenlei1>bm2" type="checkbox" onClick="autoSelect(this.id)"></input>1.2、安全生产行政许可有效</td>
       </tr>
     </table>
            <table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="tree_tab3" id="jcx01" style="display:block;">
       <tr>
        <td class="td02" align="right"><img src="http://images.cnblogs.com/16B/tree/tree_doc.gif" align="absmiddle" /></td>
        <td><input name="zfjcx" id="sjxfl_fenlei1>bm2>jcx3" type="checkbox" onClick="autoSelect(this.id)" value=3 ></input><a href=http://192.168.3.101:9000/cgi-bin/publish/iportal?u=http://192.168.3.101:9217/jianchaxiang/jianchaxiangneirong/3.html> 烟花爆竹经营单位变更经营场所或者储存仓库地址、仓储设施新(该、扩)建、经营许可证有效期满的,应当重新申请办理许可手续。</a></td>
       </tr>
      </table>

</body>
<script>
 yiXuan();
</script>
</html>

转载于:https://www.cnblogs.com/hansha-12/archive/2012/06/08/2542016.html

<think>好的,用户在使用el-tree做权限管理时,希望增删改节点时自动勾选查看节点的功能。首先,我需要明确他们的需求:在操作节点时,系统自动将“查看”权限勾选上。这可能是因为在权限管理中,查看权限通常是基础,其他操作如增删改需要依赖查看权限的存在。 接下来,我得回忆一下Element UI的el-tree组件相关的方法和属性。用户提到增删改节点时自动勾选,所以需要处理这几个操作的逻辑。根据引用[1],添加和删除节点可以使用append和remove方法,但需要指定node-key。同时,勾选节点可能需要使用setCheckedKeys方法或者操作节点的checked属性。 用户想要自动勾选查看节点,可能需要先确定这个查看节点的key或者标识。假设每个节点都有一个对应的查看权限节点,比如在数据中添加一个isView的字段,或者在节点数据中有特定的标识符。当用户进行增删改操作时,无论是新增还是修改,都需要确保对应的查看节点被勾选。 接下来考虑如何实现自动勾选。比如,在新增节点时,除了添加节点数据,还需要将查看权限的key添加到当前选中的keys数组中。可以使用this.$refs.tree.getCheckedKeys()获取已选中的keys,然后添加新的查看节点的key,再通过setCheckedKeys更新。 对于修改节点的情况,可能需要监听节点的修改事件,然后在回调函数中同样执行勾选查看节点的逻辑。删除节点时,如果删除的是某个权限节点,是否需要取消勾选查看节点?这可能需要根据业务逻辑判断,但用户可能只是希望在增改时自动勾选,删除时可能不需要处理,或者需要同步移除相关权限。 另外,引用[2]中提到禁用节点的方法,可能用户之前有处理过节点的禁用,但当前需求是自动勾选。需要确保在禁用的同时,不影响自动勾选的逻辑。比如,即使节点被禁用,仍然可以通过程序设置其勾选状态。 还需要考虑数据结构的处理。每个节点可能需要包含其对应的权限信息,比如在数据中有children数组,其中包含查看、编辑、删除等子节点。当父节点被添加或修改时,需要找到对应的查看子节点,并确保其被勾选。 可能的实现步骤包括: 1. 在新增节点的逻辑中,获取当前选中的keys,添加查看节点的key,然后更新勾选。 2. 在修改节点时,同样触发勾选查看节点的操作。 3. 使用node-key确保节点唯一标识。 4. 可能需要在节点数据中添加一个标识是否为查看节点的字段,方便查找。 需要注意的潜在问题包括:如何准确获取查看节点的key,尤其是在动态生成的树结构中;如何处理节点层级关系;以及如何避免重复勾选等。此外,要确保在Vue的响应式系统中正确更新数据,可能需要使用this.$set或Vue.set来保证数据变化的侦测。 最后,需要验证这些方法是否有效,比如在新增节点后,查看节点是否被自动勾选,并且状态是否正确反映在界面上。同时,考虑性能问题,如果树结构很大,频繁操作checked keys可能会导致卡顿,需要优化。</think>### 实现步骤 #### 1. 数据结构设计 为每个节点添加`view`标识表示"查看权限",使用`node-key`指定唯一标识字段(如`id`): ```javascript treeData: [{ id: 1, label: '用户管理', view: true, // 必须勾选 children: [{ id: 11, label: '新增用户', view: false }] }] ``` #### 2. 自动勾选逻辑 在增删改操作后,强制勾选含`view:true`的节点: ```javascript // 新增节点时 this.$refs.tree.append({ id: Date.now(), label: '新节点', view: true }, parentNode) this.autoCheckView() // 删除节点时 this.$refs.tree.remove(node) this.autoCheckView() // 修改节点时 this.$refs.tree.updateKeyChildren(node.key, newData) this.autoCheckView() ``` #### 3. 核心方法实现 ```javascript methods: { autoCheckView() { this.$nextTick(() => { const viewKeys = this.getViewKeys(this.treeData) const checkedKeys = [...new Set([...this.$refs.tree.getCheckedKeys(), ...viewKeys])] this.$refs.tree.setCheckedKeys(checkedKeys) }) }, getViewKeys(data) { return data.reduce((acc, node) => { if (node.view) acc.push(node.id) if (node.children) acc.push(...this.getViewKeys(node.children)) return acc }, []) } } ``` #### 4. 效果验证 - 新增节点时自动勾选父级`view`节点 - 删除含`view`的节点时自动取消勾选 - 通过`getCheckedKeys`获取最终权限集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值