已不推荐下载,如要下载去这个连接下载最新的 http://gundumw100.iteye.com/admin/blogs/545610
http://www.cnblogs.com/xuanye/archive/2009/11/04/Xuanye_jQuery_FlexiGrid.html
http://www.cnblogs.com/xuanye/archive/2009/11/08/Xuanye_jQuery_FlexiGrid_Demo.html
上面的2个链接是我参考的例子
虽然Flexigrid已然算是优秀,但是问题还是有?比如:
1:不支持在列首添加checkbox列
2:如何给行附加事件(如右键快显菜单或双击)或者在最后列添加操作列(在列的定义中,有个process的函数可使用,返回html,可参考示例中的formatMoney)?同时获取该列的数据?
3: 如何能够兼容 jQuery 1.3+?(默认不兼容)
4:如何改善性能问题(IE的脚本执行能力实在是可怜,特别在IE6下,当行列多时,总是有2-3秒的停滞)
5:如何让某列不参与显示隐藏控制?
6:如何格式化某列?比如工资列前加“¥”
改进后的FlexiGrid:
第一项:重新定义的皮肤
这些只需修改对饮的CSS即可实现,只是非常长,就不贴出来了,有兴趣有耐心的朋友可以去研究下代码。
第二项:在首列添加一个checkbox列
1:首先在参数中添加一个showcheckbox的参数
2:然后再输出头时判断该属性,如果为真则输出一个列包含checkbox(用于全选)
1 if (p.showcheckbox) {
2 var cth = $('
');
3 var cthch = $('
');
4 cthch.addClass("noborder")
5 //给该列添加一些自定义的属性,在生成数据行时需要用到这些属性
6 cth.addClass("cth").attr({ 'axis': "col-1", width: "22", "isch": true }).append(cthch);
7 $(tr).append(cth);
8 }
3:然后在生成数据行时通过,因为数据行的生成的依据完全是根据thead中th的属性来创建的,这样我们可以通过上面设置的isch属性在制定的列上创建checkbox列
1 $.each(data.rows,function(i,row) //循环数据行
2 {
3 var tr = document.createElement('tr');
4 if (i % 2 && p.striped) tr.className = 'erow';
5 if (row.id) tr.id = 'row' + row.id;
6 $('thead tr:first th',g.hDiv).each( //获取列头,循环列头来生成数据单元格,这里有个性能问题,即每次循环数据行都要检索列头,事实上没有必要
7 function (){...});
8 ...
9 });
4:设置checkbox头列不参与拖拽列
5:给checkbox头列添加全选的事件实现
1 if (chkall.length > 0) {
2 chkall[0].onclick = g.checkAllOrNot;
3 return;
4 }
01 checkAllOrNot: function(parent) {
02 var ischeck = $(this).attr("checked");
03 $('tbody tr', g.bDiv).each(function() {
04 if (ischeck) {
05 $(this).addClass("trSelected");
06 }
07 else {
08 $(this).removeClass("trSelected");
09 }
10 });
11 $("input.itemchk", g.bDiv).each(function() {
12 this.checked = ischeck;
13 //Raise Event
14 if (p.onrowchecked) {
15 p.onrowchecked.call(this);
16 }
17 });
18 },
6:最后一项是新增一个onrowchecked的事件,即在每一行的的checkbox选中状态发生变化时触发某个事件,onrowchecked在参数中注册。
7:新增getCheckedRows方法获取Grid中的选中行,返回是行主键的数组
第三项:修改每次都要获取记录数的bug,如果返回的记录数小于0,即没有总获取记录数,则使用上一次的获取到的记录数。
即总是在当前index为第一页是才从返回值从获取页面否则,沿用上次。和服务器端配合,可减少count的次数提高性能
第四项:Toolbar中的button增加displayname
源码toolbar中button只有name没有displayname,添加一个区分一下,不然感觉就像在C#中写了个中文的类名
第五项:快速检索增加正则表达式验证,增加操作符参数
Flexigrid有个快速检索的功能,虽然不太常用,但是偶尔的场景游泳,添加了两个参数。一个是操作标识(即=,LIKE等)
另一个正则表达式验证,即对输入查询的值进行简单的校验
第六项:可从外部集成行事件
增加参数rowhanlder,在生成行时绑定事件,如双击,右键等
第七项:在行上绑定数据
增加参数rowbinddata,配合第六个操作,如在双击事件中获取该行的数据
第八项:兼容jQuery 1.3+
当我兴致匆匆的升级了jQuery框架后,发现脚本开始报错了,于是只能阅读代码,一个一个修正。
第九项:修正了Json数据的row为null时脚本报错的问题
这个不知道算不算bug,反正是当我服务器端没有数据返回null,原来的脚本报错了,于是加了个判断
第十项:新增列不参与toggle,只需配置列的toggle=false
希望某列不参与显示隐藏控制,即在生成下拉控制器时判断该属性为真则跳过
第十一项:修改AddData的组装逻辑,优化事件附件,提升性能
原来的逻辑是通过Dom操作,将tr td生成,并添加到行列中,最后在通过检索循环触发单元格的proccess事件和行默认事件(如单击选中事件),而且在上诉两个行为中存在致使浏览器重绘Dom的操作。还存在一些不必要的循环,这样的逻辑在表格行列较多,客户机性能较差,又是IE6的话影响非常之明显。即时在我的电脑上,在IE6下仍然是表现不佳。
所以调整为添加行列统一将生成的html push到数组一次性付给tbody,同时在生成单元格html时处理process事件(不要再次查找和循环,避免多次重绘dom)
第十二项:添加extParam参数可将外部参数动态注册到grid,实现如查询等操作
下面是我根据上面测试的一个例子,本例需要结合我的另一篇文章看 http://gundumw100.iteye.com/admin/blogs/531131:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
FlexiGrid
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FlexiGridServlet extends HttpServlet {
private DBConnection db;
public void init() throws ServletException {
db = new DBConnection();// 打开链接
try {
db.getCurrentConnection();
} catch (SQLException e1) {
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response相关处理
response.setContentType("html/txt");
response.setCharacterEncoding("utf-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setHeader("Pragma", "no-cache");
String action = request.getParameter("action");
System.out.println("action================" + action);
String tableName = "job_info1";
if ("add".equals(action)) {
System.out.println("--------------------add--------------------");
return;
} else if ("delete".equals(action)) {
System.out.println("--------------------delete------------------");
String ids=request.getParameter("id");
System.out.println("ids="+ids);
String sql = "delete from "+tableName+" where id in ("+ids+")";
System.out.println("sql="+sql);
try {
db.executeUpdate(sql, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("delete success!!!");
response.getWriter().write("success");
response.getWriter().flush();
response.getWriter().close();
return;
} else if ("modify".equals(action)) {
System.out.println("--------------------modify-------------------");
String id=request.getParameter("id");
System.out.println("id="+id);
return;
} else {
}
System.out.println("--------------------下来了-------------------");
// 获得当前页数
String pageIndex = request.getParameter("page");
System.out.println("pageIndex=" + pageIndex);
// 获得每页数据最大量
String pageSize = request.getParameter("rp");
System.out.println("pageSize=" + pageSize);
// 获得模糊查询文本输入框的值
String query = new String(request.getParameter("query").getBytes("ISO8859-1"), "UTF-8");
System.out.println("query=" + query);
// 获得模糊查询条件
String qtype = request.getParameter("qtype");
System.out.println("qtype=" + qtype);
// 排序的字段
String sortname = request.getParameter("sortname");
System.out.println("sortname=" + sortname);
// desc or asc
String sortorder = request.getParameter("sortorder");
System.out.println("sortorder=" + sortorder);
int count = 0;
String sql = "";
List list = null;
try {
sql = "select count(*) from " + tableName;
if (!query.equals("")) {
sql += " where " + qtype + "='" + query + "'";
}
System.out.println("sql=" + sql);
count = db.executeQuery(sql);
System.out.println("count=" + count);
sql = "select * from " + tableName;
if (!query.equals("")) {
sql += " where " + qtype + "='" + query + "'";
}
sql += " order by " + sortname + " " + sortorder;
sql += " limit "
+ ((Integer.parseInt(pageIndex) - 1) * Integer
.parseInt(pageSize)) + "," + pageSize;
System.out.println("sql=" + sql);
list = db.executeQueryList(sql);
System.out.println("list.size=" + list.size());
if (list == null) {
System.out.println("======出错啦======");
return;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Map map = new HashMap();
map.put("page", pageIndex);
map.put("total", count + "");
// 数据JSON格式化
String json = toJSON(list, map);
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void destroy() {
db.closeCurrentConnection();
}
/**
* 数据JSON格式化
*
* @param list
* @param pageInfo
* @return
*/
private String toJSON(List list, Map map) {
List mapList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Map cellMap = new HashMap();
cellMap.put("id", ((Map) list.get(i)).get("id").toString());
cellMap.put("cell", new Object[] {
//" ",
((Map) list.get(i)).get("id"),
((Map) list.get(i)).get("job_name"),
((Map) list.get(i)).get("work_address"),
((Map) list.get(i)).get("salary"),
((Map) list.get(i)).get("date"),
((Map) list.get(i)).get("language") });
mapList.add(cellMap);
}
map.put("rows", mapList);
JSONObject object = new JSONObject(map);
return object.toString();
}
}
大小: 50.7 KB
flexiGrid.zip (519.2 KB)
下载次数: 1277