`
jetway
  • 浏览: 473555 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

YUI:带checkbox的TreeView的赋值与读值

阅读更多

日前做一个用户权限管理的页面,权限是一个树形结构,每个节点前是一checkbox,其状态表示
用户是否具有该权限,当切换用户时,根据选择用户的权限设置树形的相应节点,保存时根据当
前用户的选中情况保存数据。

画面如下:


其间主要碰到三个问题

1)带checkbox的TreeView的显示
2)根据用户权限数据对权限树赋值
3)根据树形中checkbox的状态获取权限数据

其解决办法如下:
1)

HTML中展现TreeView的div需要将class设为"ygtv-checkbox"

Html代码 复制代码
  1. <div id="divMenuTree" class="ygtv-checkbox"></div>  
<div id="divMenuTree" class="ygtv-checkbox"></div>



另外javascript里要做如下处理(详细功用参见注释):

Javascript代码 复制代码
  1. menuTree = new YAHOO.widget.TreeView("divMenuTree", treeJSON);   
  2. //点击节点时变换checkbox状态   
  3. menuTree.subscribe('clickEvent', menuTree.onEventToggleHighlight);   
  4. //节点状态变化时相应改变其父、子节点的状态   
  5. menuTree.setNodesProperty('propagateHighlightUp'true);   
  6. menuTree.setNodesProperty('propagateHighlightDown'true);  
menuTree = new YAHOO.widget.TreeView("divMenuTree", treeJSON);
//点击节点时变换checkbox状态
menuTree.subscribe('clickEvent', menuTree.onEventToggleHighlight);
//节点状态变化时相应改变其父、子节点的状态
menuTree.setNodesProperty('propagateHighlightUp', true);
menuTree.setNodesProperty('propagateHighlightDown', true);



2)
可以用TreeView的getNodeByIndex或者getNodeByProperty取得节点,然后
使用Node的unhighlight不选,用highlight选中节点,代码片段如下:

Javascript代码 复制代码
  1. //清除所有checkbox   
  2. for(var i=1; i<=menuTree.getNodeCount(); i++) {   
  3.     menuTree.getNodeByIndex(i).unhighlight(true);   
  4. }   
  5. //设定当前用户的权限   
  6. //只勾选叶子节点的checkbox,它们的上级节点状态会自动跟着变化,不用设置   
  7. for(var i=0; i<menus.size(); i++) {   
  8.     var node = menuTree. getNodeByProperty('data', menus[i]);   
  9.     if (!node.hasChildren(true)) {   
  10.         node.highlight(false);   
  11.     }   
  12. }  
//清除所有checkbox
for(var i=1; i<=menuTree.getNodeCount(); i++) {
	menuTree.getNodeByIndex(i).unhighlight(true);
}
//设定当前用户的权限
//只勾选叶子节点的checkbox,它们的上级节点状态会自动跟着变化,不用设置
for(var i=0; i<menus.size(); i++) {
	var node = menuTree. getNodeByProperty('data', menus[i]);
	if (!node.hasChildren(true)) {
		node.highlight(false);
	}
}



在设定当前用户的权限时,非叶子节点的状态可能是选中、部分选中和未选中,我
们不必自己判断,只要仅对叶子节点进行设置,然后让YUI自己去改变其上级节点状
态就可以了。
其中unhighlight,highlight的参数表示是否不改变该节点的上下级节点状态,在
清除所有checkbox时不需要改变,但在设定当前用户的权限时正好可以利用这一功能。

3)
YUI的带checkbox的TreeView其实不是真正的checkbox,是用css切换图片实现的,所以
好像无法像一组checkbox一样直接取得选中信息(我是没找到),不过可以根据Node的
highlightState属性知道该节点的状态,其中0表示未选中,1未部分选中,2未选中,所
以下面这段代码可以将选中的权限的ID组成一个数组:

Javascript代码 复制代码
  1. var menuIDs = new Array();   
  2. var idx = 0;   
  3. for(var i=1; i<=menuTree.getNodeCount(); i++) {   
  4.     var node = menuTree.getNodeByIndex(i);   
  5.     if (node.highlightState > 0) {   
  6.         menuIDs[idx] = node.data;   
  7.         idx ++;   
  8.     }   
  9. }  
var menuIDs = new Array();
var idx = 0;
for(var i=1; i<=menuTree.getNodeCount(); i++) {
	var node = menuTree.getNodeByIndex(i);
	if (node.highlightState > 0) {
		menuIDs[idx] = node.data;
		idx ++;
	}
}



总的感觉YUI是一个比较全面的库,虽然写法有些繁琐,但作为一个还算面面俱到的库使用
起来还是感觉蛮不错的,我只是另外少数地方用到了prototype,感觉就它们俩一般问题都
能搞定了。

最后,贴出整个页面的代码,其中很多是和TreeView无关的代码。我和后台交互的是json
格式的数据,具体我就不说明了,根据代码也能猜出个大概其了。

Html代码 复制代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2.   
  3. <html>  
  4.   
  5. <head>  
  6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7.     <title>JNOC OA</title>  
  8.        
  9.     <link rel="stylesheet" type="text/css" href="../../js/yui_2.8.1/reset/reset.css">  
  10.     <link rel="stylesheet" type="text/css" href="../../js/yui_2.8.1/fonts/fonts.css">  
  11.     <link type="text/css" rel="stylesheet" href="../../css/common.css"/>  
  12.        
  13.     <style type="text/css">        
  14.         table#pageTable {   
  15.             width: 80%;   
  16.         }   
  17.            
  18.         table#pageTable tr#user {   
  19.             background-color:#FFFFCC;   
  20.         }   
  21.            
  22.         table#pageTable tr#privilege {   
  23.             background-color:#CCFFFF;   
  24.         }   
  25.            
  26.         table#pageTable th {   
  27.             vertical-align: top;   
  28.         }   
  29.     </style>  
  30.        
  31.     <script type="text/javascript" src="../../js/prototype_1.6.1/prototype.js"></script>  
  32.     <script type="text/javascript" src="../../js/yui_2.8.1/yahoo/yahoo.js"></script>  
  33.     <script type="text/javascript" src="../../js/yui_2.8.1/yuiloader/yuiloader.js"></script>  
  34.     <script type="text/javascript" src="../../js/common.js"></script>  
  35.     <script type="text/javascript">  
  36.         var menuTree;   
  37.            
  38.         function showMenuTree() {   
  39.             YAHOO.util.Connect.setDefaultPostHeader(false);   
  40.             YAHOO.util.Connect.initHeader("Accept", "application/json", true);   
  41.                
  42.             var request = YAHOO.util.Connect.asyncRequest('POST', JNOCOA_ROOT_PATH + '/menuInfo/getMenuJSON.do', {   
  43.                 success: function(resp){   
  44.                     var resprespJSON = resp.responseText.evalJSON();   
  45.                     if (respJSON.successed) {   
  46.                         var treeJSON = respJSON.returnObject.evalJSON();   
  47.                         menuTree = new YAHOO.widget.TreeView("divMenuTree", treeJSON);   
  48.                         menuTree.subscribe('clickEvent', menuTree.onEventToggleHighlight);   
  49.                         menuTree.setNodesProperty('propagateHighlightUp', true);   
  50.                         menuTree.setNodesProperty('propagateHighlightDown', true);   
  51.                         menuTree.render();   
  52.                     }   
  53.                     else {   
  54.                         alert(respJSON.errors[0].message);   
  55.                     }   
  56.                 },   
  57.                 failure: function(error){   
  58.                     alert("读取菜单数据错误:" + error.statusText);   
  59.                 }   
  60.             }, null);   
  61.         }   
  62.            
  63.         function loadUsers() {   
  64.             YAHOO.util.Connect.setDefaultPostHeader(false);   
  65.             YAHOO.util.Connect.initHeader("Accept", "application/json", true);   
  66.                
  67.             var request = YAHOO.util.Connect.asyncRequest('POST', JNOCOA_ROOT_PATH + '/userInfo/getAllUser.do', {   
  68.                 success: function(resp){   
  69.                     var resprespJSON = resp.responseText.evalJSON();   
  70.                     if (respJSON.successed) {   
  71.                         users = respJSON.returnObject;   
  72.                         var seleUser = $("userList");   
  73.                         for (var i=0; i<users.length; i++) {   
  74.                             oOption = document.createElement('option');   
  75.                             oOption.appendChild(document.createTextNode(users[i].name));   
  76.                             oOption.setAttribute('value', users[i].id);   
  77.                             seleUser.appendChild(oOption);   
  78.                         }   
  79.   
  80.                         YAHOO.util.Event.addListener(seleUser, "change", refreshPrivilege);   
  81.                     }   
  82.                     else {   
  83.                         alert(respJSON.errors[0].message);   
  84.                     }   
  85.                 },   
  86.                 failure: function(error){   
  87.                     alert("读取用户数据错误:" + error.statusText);   
  88.                 }   
  89.             }, null);   
  90.         }   
  91.   
  92.         function refreshPrivilege() {   
  93.             var selectedIdx = this.selectedIndex;   
  94.             var userID = parseInt(this.options[selectedIdx].getAttribute('value'));   
  95.   
  96.             //准备POST数据:用户ID   
  97.             var data = $H( { id : userID }).toJSON();   
  98.                
  99.             YAHOO.util.Connect.setDefaultPostHeader(false);   
  100.             YAHOO.util.Connect.initHeader("Accept", "application/json", true);   
  101.             YAHOO.util.Connect.initHeader("Content-Type", "application/json; charset=utf-8", true);   
  102.                
  103.             var request = YAHOO.util.Connect.asyncRequest('POST', JNOCOA_ROOT_PATH + '/privilege/get.do', {   
  104.                 success: function(resp){   
  105.                     var resprespJSON = resp.responseText.evalJSON();   
  106.                     if (respJSON.successed) {   
  107.                         menus = respJSON.returnObject.menuIDs;   
  108.                         //清除所有checkbox   
  109.                         for(var i=1; i<=menuTree.getNodeCount(); i++) {   
  110.                             menuTree.getNodeByIndex(i).unhighlight(true);   
  111.                         }   
  112.                         //勾选叶子节点的checkbox,它们的上级节点状态会自动跟着变化,不用设置   
  113.                         for(var i=0; i<menus.size(); i++) {   
  114.                             var node = menuTree. getNodeByProperty('data', menus[i]);   
  115.                             if (!node.hasChildren(true)) {   
  116.                                 node.highlight(false);   
  117.                             }   
  118.                         }   
  119.                     } else {   
  120.                         alert(respJSON.errors[0].message);   
  121.                     }   
  122.                 },   
  123.                 failure: function(error){   
  124.                     alert("读取用户权限数据错误:" + error.statusText);   
  125.                 }   
  126.             }, data);   
  127.         }   
  128.   
  129.         function savePrivilege() {   
  130.             if (!menuTree) {   
  131.                 return;   
  132.             }   
  133.   
  134.             var selectedIdx = $('userList').selectedIndex;   
  135.             var userID = parseInt($('userList').options[selectedIdx].getAttribute('value'));   
  136.             var menuIDs = new Array();   
  137.             var idx = 0;   
  138.             for(var i=1; i<=menuTree.getNodeCount(); i++) {   
  139.                 var node = menuTree.getNodeByIndex(i);   
  140.                 if (node.highlightState > 0) {   
  141.                     menuIDs[idx] = node.data;   
  142.                     idx ++;   
  143.                 }   
  144.             }   
  145.   
  146.             var data = $H( { userID : userID, menuIDs : menuIDs }).toJSON();   
  147.   
  148.             YAHOO.util.Connect.setDefaultPostHeader(false);   
  149.             YAHOO.util.Connect.initHeader("Accept", "application/json", true);   
  150.             YAHOO.util.Connect.initHeader("Content-Type", "application/json; charset=utf-8", true);   
  151.                
  152.             var request = YAHOO.util.Connect.asyncRequest('POST', JNOCOA_ROOT_PATH + '/privilege/change.do', {   
  153.                 success: function(resp){   
  154.                     var resprespJSON = resp.responseText.evalJSON();   
  155.                     if (respJSON.successed) {   
  156.                         alert('已成功修改用户权限。');   
  157.                     } else {   
  158.                         alert(respJSON.errors[0].message);   
  159.                     }   
  160.                 },   
  161.                 failure: function(error){   
  162.                     alert("修改用户权限失败:" + error.statusText);   
  163.                 }   
  164.             }, data);   
  165.         }   
  166.            
  167.         new YAHOO.util.YUILoader( {   
  168.             require : [ 'menu', 'event', 'connection', 'datasource', 'datatable', 'treeview' ],   
  169.             base : '../../js/yui_2.8.1/',   
  170.             filter : 'RAW',   
  171.             onSuccess : function() {   
  172.                 YAHOO.util.Event.onContentReady("menubar", function() {   
  173.                     getMenu();   
  174.                 });   
  175.   
  176.                 YAHOO.util.Event.onContentReady("userList", function() {   
  177.                     loadUsers();   
  178.                 });   
  179.   
  180.                 YAHOO.util.Event.onContentReady("divMenuTree", function() {   
  181.                     showMenuTree();   
  182.                 });   
  183.             },   
  184.             onFailure : function(o) {   
  185.                 alert("YUI模块加载错误: " + YAHOO.lang.dump(o));   
  186.             }   
  187.         }).insert();   
  188.     </script>  
  189. </head>  
  190.   
  191. <body class="yui-skin-sam">  
  192.     <div id="banner"></div>  
  193.     <div id="menu">  
  194.         <div id="menubar" class="yuimenubar yuimenubarnav">  
  195.             <div class="bd">  
  196.                 <ul class="first-of-type">  
  197.                     <li class="yuimenubaritem first-of-type">  
  198.                         <a class="yuimenubaritemlabel">数据录入</a>  
  199.                     </li>  
  200.                     <li class="yuimenubaritem">  
  201.                         <a class="yuimenubaritemlabel">数据修改</a>  
  202.                     </li>  
  203.                     <li class="yuimenubaritem">  
  204.                         <a class="yuimenubaritemlabel">数据检索</a>  
  205.                     </li>  
  206.                     <li class="yuimenubaritem">  
  207.                         <a class="yuimenubaritemlabel">报表</a>  
  208.                     </li>  
  209.                     <li class="yuimenubaritem">  
  210.                         <a class="yuimenubaritemlabel">系统</a>  
  211.                     </li>  
  212.                 </ul>  
  213.             </div>  
  214.         </div>  
  215.     </div>  
  216.     <div id="desktop">  
  217.         <div id="pageTitle">用户权限管理</div>  
  218.         <table id="pageTable">  
  219.             <tr id="user">  
  220.                 <th width="10%">用户:</th>  
  221.                 <td>  
  222.                     <select id="userList">  
  223.                         <option value="-1">请选择用户</option>  
  224.                     </select>  
  225.                     <button onclick="savePrivilege()">保存</button>  
  226.                 </td>  
  227.             </tr>  
  228.             <tr id="privilege">  
  229.                 <th>权限:</th>  
  230.                 <td><div id="divMenuTree" class="ygtv-checkbox"></div></td>  
  231.             </tr>  
  232.         </table>  
  233.     </div>  
  234.   
  235.     <div id="footer">  
  236.         <table width="100%">  
  237.             <tr>  
  238.                 <td id="loginUser" width="200px"></td>  
  239.                 <td width="500px"></td>  
  240.                 <td width="100px" align="right"><a href="javascript:logout();">退出</a></td>  
  241.             </tr>  
  242.         </table>  
  243.     </div>  
  244. </body>  
  245.   
  246. </html>  
分享到:
评论

相关推荐

    yui_2.9.0前端UI

    YUI 库,全称Yahoo! UI Library。是一组工具和控件,用JavaScript写成, 为的是用DOM 脚本,DHTML和AJAX等技术创建丰富的网页交互式应用程序。 YUI 基于BSD协议,对所有的使用方式都是免费的。YUI 项目包括YUI 库和两...

    yui:最小的vim配色方案

    yui:最小的vim配色方案

    layui默认选中table的CheckBox复选框方法

    方法一:如何根据条件判断是否默认选中table表格前面的复选框 ... {type:'checkbox'} , {field: 'userName',sort: true, title: '用户名称'} , {field: 'account',sort: true, title: '登录账户'} , {field: 'dele

    nodejs-yui:这是带有yui的node.js

    nodejs-yui 这是带有yui的node.js 首先在您的计算机上安装node.js。 将此文件解压缩到目录中。 从终端窗口进入目录并运行'npm install'可能是需要此权限的sudo用户权限。 运行“节点服务器”。 转到

    yui_2.9.0用于javascript基础教程

    适合图灵程序设计丛书web开发系列-javascript基础教程的学习使用

    yui2.9

    NULL 博文链接:https://lsqwzz.iteye.com/blog/1228250

    chosen-yui:选择 JS -- 转换为 YUI

    选择-yui 使用,请确保获取原生 js 文件, 和 。 那么你都准备好了。 使用 selected.yui.js 而不是 selected.prototype 或 selected.jquery 他们 (HarvestHQ) 正准备发布 ChosenJS 的完全原生版本,所以我不打算...

    yuicompressor-yui compressor

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...

    YUI 入门教程YUI 入门教程YUI 入门教程

    YUI教程YUI 入门教程YUI 入门教程YUI 入门教程

    Yui:一款由eris和love打造的超棒Discord机器人!

    Yui,这是一个由node.js和discord.js构成的Discord机器人。 自托管机器人 我不支持或鼓励对该机器人进行自我托管。 此处的代码用于学习和提高透明度。 只要您遵守许可,我们都不会在乎您是否托管自己的Yui版本。 ...

    高效WEB前端开发之路:YUI3.15

    在Web方面,其必须与各种DOM技术结合才能发挥作用。因此,一些具有开拓创新精神的开发者们便开发出了各种丰富的第三方框架,通过第三方的支持代码实现浏览器兼容性的统一、代码的简化以及功能的增强。  本书作者便...

    YUI3.7.3 最新版本 带API

    YUI3.7.3 服务器上最新的版本 快来下载 带API

    yui:IRKit中的智能生活

    ui yasuda用户界面-IRKit中的Smart Living安装npm install开始npm start结构(假设) | | | | 消费类电子产品

    js 压缩YUI

    雅虎的东西,简单的操作很好用 使用例子:java -jar D:\yuicompressor\yuicompressor\yuicompressor.jar E:\js\all.js -o E:\wap\wap2\js\all-min.js --charset utf-8 当然要装jdk了 不然就玩完了

    解决Layui数据表格中checkbox位置不居中的方法

    使用方法渲染的方式生成数据表格,添加了checkbox,但发现checkbox位置不居中,如下图所示 2、解决办法 通过layui官方社区,找到如下代码,只需要添加如下样式即可解决 .layui-table-cell .layui-form-checkbox...

    yui3-master.zip

    yui3-master.zip

    yui 资源包

    yui 源码下载,3.9.0 r2 包,最新版本

    layui点击数据表格添加或删除一行的例子

    数据表格 t2 = { elem: '#test2', data: tableData2, ... {type:'checkbox',field:'id'}, {field:'cstMoldNo', title: '客户模号',edit:'text'}, {field:'cstProdName', title: '产品名称',edit:'text'}, {fiel

    discord-bot-Yui:游戏设计IP宇宙的不和谐机器人

    Discord-bot-Yui “游戏设计界”的Discord机器人 设置 转到不和谐网站上以生成您的令牌并将其复制到config.json 按“开始”,您将看到“就绪”并享受它! 公告 更新2021/03/23 基本功能设置。

    YUI2 库与例子都有了

    YUI2 库与例子都有了。很强大。 YUI2 库与例子都有了。很强大。

Global site tag (gtag.js) - Google Analytics