? 近来根据项目需求,需要实现动态的根据json文本生成一个可分组的table功能,并且需要实现类似tree的展开和收缩功能, 另外附带checkboxpartial check功能。
? 查阅了不少js framework,没有比较顺手的,都需要二次开发,于是打算自己写一个简单的, 先看一个页面:
?Basic Framework: Jquery, 因为需要很多的selector操作,而jquery的$()不是盖的,而且只需要用到jquery的min js,比较轻量级。
Partial Checkbox 的实现,因为checkbox本身不支持partial check, 所以需要用图片来实现,基本原理是底层一个白色的空图片,根据点击事件来动态的更换background picture。
Json parser: 我实现的很简单,json文本中放置一个数组,里面是需要显示的对象, 利用jquery的each方法遍历文本,分析出group和group item, 调用jquery的append方法生成tr
json 文本如下:
?
var data = {"source": [ { "groupName":100001, "setpointTemplateId":2212, "protocolName":"ComTrol 6k", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"SUCT PRES SETPT", "energyCritical":true, "alarmSetpoint":false, "checkOveride":false, "isChecked":true, "checkWaringMsg":"function(isChecked){if(isChecked){alert('If you unchecked this point, you can not calculate the benefit.');}}" }, { "groupName":100001, "setpointTemplateId":2213, "protocolName":"ComTrol 6k", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"Lead Float Ckt", "energyCritical":false, "alarmSetpoint":true, "checkOveride":false, "isChecked":false, "checkWaringMsg":'' }, { "groupName":100001, "setpointTemplateId":2214, "protocolName":"ComTrol 6k", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"FLOAT TEMP", "energyCritical":true, "alarmSetpoint":false, "checkOveride":false, "isChecked":false, "checkWaringMsg":'' }, { "groupName":100002, "setpointTemplateId":1000, "protocolName":"E2", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"CONTROL TEMP", "energyCritical":false, "alarmSetpoint":true, "checkOveride":false, "isChecked":false, "checkWaringMsg":'' }, { "groupName":100002, "setpointTemplateId":1001, "protocolName":"E2", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"FLOAT TEMP", "energyCritical":true, "alarmSetpoint":false, "checkOveride":false, "isChecked":false, "checkWaringMsg":'' }, { "groupName":100002, "setpointTemplateId":1002, "protocolName":"E2", "unifiedAppTypeName":"Suction Group", "unifiedPointName":"FLOAT TEMP", "energyCritical":false, "alarmSetpoint":true, "checkOveride":false, "isChecked":false, "checkWaringMsg":'' } ] };
?html页面:
?
?
<!DOCTYPE html> <html> <head> <script type="text/javascript" src="data.js"></script> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="index_1.js"></script> <style type="text/css"> .node-unchecked {background-image: url(unchecked.gif);} .node-checked-partial {background-image: url(checked-partial.gif);} .node-checked {background-image: url(checked.gif);} .image-checkbox {border: 0 none;height: 18px;margin: 0;padding: 0;vertical-align: middle;width: 15px;background-repeat: no-repeat;} #custom_profile_table { border-collapse:collapse; } #custom_profile_table td, #custom_profile_table th { border:1px solid #ADADAA; padding:3px 3px 3px 3px; text-align:center; } #custom_profile_table th { text-align:center; padding-top:5px; } #custom_profile_table tr.alt td { color:#000; background-color:#EAF2D3; } </style> </head> <body> <table> <tr> <td><button onClick="selectHelperHandler('SELECT_ALL_ENERGY')">Select all Energy Critical Setpoint</button></td> <td><button onClick="selectHelperHandler('SELECT_ALL_ALARM')">Select all Alarm Setpoint</button></td> <td><button onClick="selectHelperHandle