项目使用JQuery,有个数据回显页面,客户要求提供一个下拉列表,通过选择下拉列表中的数据来定制数据表格的列。用户选择一个,表格就会相应的加一列来显示用户的选择。用Jquery做了简单的实现,初次接触JQuery(以前用EXTJS),还没有从EXT那种企业级的js框架中缓过劲儿来。做这个例子过程中记录了一些笔记,便于以后翻查:
1. 选择器返回的jquery对象不需要判空,而且支持链式操作,这是和extjs很大的区别,对习惯了java编程的人说稍稍有点不习惯
2. JQuery对DOM节点的控制特别灵活。虽然EXTJS也可以实现类似的动作但是它毕竟是面向组件的,这种外科手术似的小操作不是EXT的本功。
3. JQuery的浏览器兼容性比EXT要好的多,这是EXT自己的软肋。这个例子碰到一个兼容性的问题(.css('display', 'block')在IE下正常但是在FF下所有的列都挤到第一列中了,可以google一下'CSS display', 改为使用JQuery的show方法
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style> body { margin: 50px 100px; } #dataTable tr td{ width: 100px; display: none; } .theader { background:#A4D4FC; } </style> <script src="jquery-1.8.1.js"></script> <script type="text/javascript"> $(function(){ //init page var columns = ['Column A', 'Column B', 'Column C', 'Column D', 'Column E', 'Column F', 'Column G']; for(var i=0; i < columns.length; i++){ //generate dropdown list $('#ColSelect').append('<option>' + columns[i] + '</option>'); //generate header $('#dataTable tr[class="theader"]').append('<td id="head_' + (i+1) +'"></td>'); //generate table body $('#dataTable tr[class="tbody"]').append('<td name="col_' + (i+1) + '"></td>'); } //JSON format data var data = { 'Column A': ['A1', 'A2', 'A3', 'A4', 'A5'], 'Column B': ['B1', 'B2', 'B3', 'B4', 'B5'], 'Column C': ['C1', 'C2', 'C3', 'C4', 'C5'], 'Column D': ['D1', 'D2', 'D3', 'D4', 'D5'], 'Column E': ['E1', 'E2', 'E3', 'E4', 'E5'], 'Column F': ['F1', 'F2', 'F3', 'F4', 'F5'], 'Column G': ['G1', 'G2', 'G3', 'G4', 'G5'] }; //Generate tr as per data size for(var i=0; ++i < data['Column A'].length; ){ $('#dataTable').append($('#dataTable tr:last').clone()); } //after tr generate, add stripe style on tr $("#dataTable tr:even[class!='theader']").css("background","#EFEFEF"); //register event on dropdown list. var colIndex = 0; $('#ColSelect').change(function(e){ $("#ColSelect option:selected").each(function () { var val = $(this).val(); if(val){ colIndex++; $(this).remove();//remove selected from dropdown $('#head_'+colIndex).text(val).show();//css('display', 'block');//display header, Note:css('display', 'block') have compatibility issue on FF var idx = 0; $('td[name="col_'+colIndex+'"]').each(function(){ $(this).text(data[val][idx++]).show();//loop to put value in each tr for one column }); } }); }); }); </script> <title>JQuery</title> </head> <body> <select id="ColSelect"> <option value="">--Select--</option> </select> <table id="dataTable"> <tr class="theader"></tr> <tr class="tbody"></tr> </table> </body> </html>