JS高级第五天:
来源:互联网 发布:沙漠靴品牌知乎 编辑:程序博客网 时间:2024/05/16 08:51
做一个表格的项目,需求是:动态加载数据库的表中的数据,显示在html上,并且当鼠标点击某一个单元格能启用编辑功能,而且可以修改和删除。
先来一个全手写,js中拼接表格的代码(简单)
以下是js文件中的代码:
/*** 当加载table1.html时,发出ajax请求,查询出数据库中某一张表的所有的数据,把这些数据回调到* js的客户端,动态的填充表格*/var table = {/*** 触发ajax请求,加载数据库中的一张表*/loadData: function(){$.post("menuitemAction_showMenuitems.action",null,function(data){//拼第一列var $title_midTD=$("<td></td>");$title_midTD.text("mid");$title_midTD.attr("style","width:160px");var $title_tidTD=$("<td></td>");$title_tidTD.text("tid");$title_tidTD.attr("style","width:160px");var $title_nameTD=$("<td></td>");$title_nameTD.text("name");$title_nameTD.attr("style","width:160px");var $title_optionTD=$("<td></td>");$title_optionTD.text("操作");$title_optionTD.attr("style","width:160px");//拼第一行var $title_tr=$("<tr></tr>");$title_tr.append($title_midTD);$title_tr.append($title_tidTD);$title_tr.append($title_nameTD);$title_tr.append($title_optionTD);$("table").append($title_tr);//data就是数据库表中是数据,现在要循环这个数据,取得数据库中的表中的每一行,拼接到表格中for ( var i = 0; i < data.length; i++) {//这是创建一个td的容器,用来存放要放到第一列中的内容//循环拼列var $midTD=$("<td></td>");$midTD.text(data[i].mid);$midTD.attr("style","width:160px");var $pidTD=$("<td></td>");$pidTD.text(data[i].pid);$pidTD.attr("style","width:160px");var $nameTD=$("<td></td>");$nameTD.text(data[i].name);$nameTD.attr("style","width:160px");//添加超级链接按钮var $delA=$("<a></a>");$delA.text("删除");var $delTD=$("<td></td>");$delTD.attr("style","width:160px");$delTD.append($delA);//循环拼行var $tr=$("<tr></tr>");$tr.append($midTD);$tr.append($pidTD);$tr.append($nameTD);$tr.append($delTD);$("table").append($tr);}});}};$().ready(function(){table.loadData();});
以下是html里面的代码:
<!DOCTYPE html><html><head><title>table.html</title><meta name="keywords" content="keyword1,keyword2,keyword3"><meta name="description" content="this is my page"><meta name="content-type" content="text/html; charset=utf-8"><!--<link rel="stylesheet" type="text/css" href="./styles.css">--></head><script src="../js/jquery-1.4.2.js"></script><!--<script src="../js/jquery-plugin-post.js"></script>--><script src="mytable.js"></script><body>This is my HTML page. <br><div id="mygrid"><table border="1" class="dataGrid"></table></div></body></html>
下面来个重构(难度较大)
/*** 分析table1.js的缺点:* 1、在table1.js中的post请求中三个参数都是固定的,所以这样写不利于重用* 可以通过传递参数的形式解决该问题* 2、$midTD.text(data[i].mid);这样的代码和具体的数据库中的字段相对应,不利于重用* 在表的表头中有一个属性,该属性就是用来标示要显示的字段的* <th field="mid" style="width: 160px;">mid</th><th field="pid" style="width: 160px;">pid</th><th field="name" style="width: 160px;">name</th><th field="option" style="width: 160px;">操作</th>* 3、在进行删除的时候,要往后台传递一个参数,而参数的名称不能确定* 4、数据库中的字段的名称和页面上表格的字段的名称相对应* 5、用unbind和bind声明事件只能在已经存在的dom元素上添加事件* 可以利用delegate声明事件* 6、在动态的创建表的过程中写了大量的重复性的代码创建tr和td* 可以写一个方法,让所有的tr和td的创建共用一个方法*/(function($) {//dataGrid函数两个作用,第一把普通表格变成 自定义dataGrid组件, 第二:dataGrid(methodName,params),调用当前dataGrid组件上面的方法.$.fn.dataGrid = function(options,param) {if(typeof options == 'string'){return $.fn.dataGrid.methods[options](this,param);}var me = this;//获取dataGrid中的表头 含有属性field,一开始的时候,含有属性field的只有th,而th包含了所有的列项var columns = me.find("thead *[field]");//把列的信息缓存在table中me.data("columns",columns);//存储配置参数信息.me.data("options",options||{});//加载远程数据.me.dataGrid("loadData");//所有匹配的元素进行事件绑定,事件委派.me.delegate("tbody td","click",function(){$(this).trigger("clickcell",[me,this]);});if(options.editor && options.editor.isEditor){me.bind("clickcell",function(event,grid,td){var cell = $(td);//获取编辑列所在的所在行var row = cell.parent();//获取当前行关联的数据,不以td中文本为基准.var data = row.data("data");var field = cell.attr("field");var val = data[field];grid.dataGrid("editCell",{data:data,row:row,field:field,cell:cell,val:val});});}};//通过columns[th,th,th],索引,数据,创建<tr><td>...</td><td>...</td></tr>function renderRow(columns,index,data){var row = $("<tr></tr>").data("data",data);$.each(columns,function(){//获取表格的列var field = $(this).attr("field");var td = $("<td field=\""+field+"\">"+(data[field]||"")+"</td>");row.append(td);});return row;}$.fn.dataGrid.methods={/*** 获取配置参数* $("#myDataGrid").dataGrid("config","url");*/config : function(jq,key){var config = jq.data("options");return config[key];},/*** 编辑某一个列,如果当前列正在编辑忽略.* @param jq* @param opts*/editCell : function(jq,opts){var data,row,cell,val,field;data = opts.data;row = opts.row;cell = opts.cell;val = opts.val;field = opts.field;//当前列正在编辑中.if(cell.data("isEditing")){return;}var editor = jq.dataGrid("createEditor",val);cell.empty().append(editor);editor.focus().val(val);//标示列正在编辑中.cell.data("isEditing",true);editor.one("blur",function(){cell.data("isEditing",false);data[field] = editor.val();cell.html(data[field]);editor.remove();var eidtor = jq.dataGrid("config","editor");$.post(eidtor.url,data);});},/*** 通过JSON数据添加数据.* @param jq* @param data*/render:function(jq,data){var columns = jq.data("columns");var table = jq.find("table");var tbody = table.children("tbody");if(tbody.size()>0){tbody.empty();}else{tbody = $("<tbody></tbody>");tbody.appendTo(table);}$.each(data,function(index,data){var row = renderRow(columns,index,data);tbody.append(row);});},createEditor:function(jq){var editor = $("<input type='text'/>");return editor;},/*** 所有的数据的加载,全部在这个方法中封装* @param jq*/loadData : function(jq) {/** 从缓存中的options中把url和params提取出来*/var url = jq.dataGrid("config","url");var params = jq.dataGrid("config","params");$.post(url,params,function(data) {jq.dataGrid("render",data);});}};})($);$().ready(function() {$("#mygrid").dataGrid({url : '../menuitemAction_showMenuitems.action',params : null,editor : {isEditor : true,url : "../personAction_updatePersons.action"}});});
0 0
- JS高级第五天:
- JS第五天总结
- node.js第五天
- JS第五天
- web第五天js
- 1.9JS的第五天
- JS高级第一天:
- JS高级第三天:
- C#学习第五天 方法和方法的高级参数
- C#高级编程第五天----流控制(控制语句)
- 第五天
- 第五天
- 第五天
- 第五天
- 第五天
- 第五天
- 第五天
- 第五天
- JS高级第二天:
- 三大框架之spring第一天:
- JS高级第三天:
- JS第四天:
- 解决启动myeclipse报错:building workspace的问题(转)
- JS高级第五天:
- 全文检索(lucene)
- SSH常用配置+web.xml配置
- 杰信项目第二天之poi-导出工作表+小细节
- 杰信项目第三天知识点(工作表模板+动态生成目录+动态生成重名文件+购销合同增删改查)
- 杰信项目第四天(购销合同,货物信息,附件信息三表联查)
- 杰信项目第五天(合同复制+合同查看+出货表)
- 杰信个项目第六天
- 丑数(数论)