jQuery之自定义datagrid控件

sldatagrid

效果:

jQuery之自定义datagrid控件

sldatagrid.js

jQuery之自定义datagrid控件
  1 (function($) {

  2     function loadColumns(sldatagrid, columns) {

  3         $(sldatagrid).empty();

  4         $(sldatagrid).append("<thead><tr></tr></thead><tbody></tbody>");

  5         var thead = $("thead", sldatagrid);

  6         var tr = $("tr", thead);

  7         $.each(columns, function(i, n) {

  8             var settings = {};

  9             $.extend(settings, $.fn.sldatagrid.column, n);

 10             if (settings.html == "") {

 11                 if (settings.field == "ck") {

 12                     $("<th class='sldatagrid-header-check' field='ck' align='center' style='" + settings.style + "'></th>").data("settings", settings).appendTo(tr);

 13                     $("<input>", {

 14                         type : 'checkbox',

 15                         click : function() {

 16                             if (!$(sldatagrid).data("settings").singleSelect) {

 17                                 if (this.checked) {

 18                                     $.each(thead.next().children(), function() {

 19                                         $(this).addClass("sldatagrid-row-selected");

 20                                         $("td :checkbox", this).attr("checked", "checked");

 21                                     });

 22                                 } else {

 23                                     $.each(thead.next().children(), function() {

 24                                         $(this).removeClass("sldatagrid-row-selected");

 25                                         $("td :checkbox", this).removeAttr("checked");

 26                                     });

 27                                 }

 28                             } else {

 29                                 return false;

 30                             }

 31                         }

 32                     }).appendTo($("th", tr));

 33                 } else {

 34                     if (settings.hidden) {

 35                         $("<th class='sldatagrid-header-cell' field='" + settings.field + "' align='" + settings.align + "' style='" + settings.style + ";display:none;'>" + settings.title + "</th>").data("settings", settings).appendTo(tr);

 36                     } else {

 37                         $("<th class='sldatagrid-header-cell' field='" + settings.field + "' align='" + settings.align + "' style='" + settings.style + "'>" + settings.title + "</th>").data("settings", settings).appendTo(tr);

 38                     }

 39                 }

 40             } else {

 41                 $("<th class='sldatagrid-header-custom' field='" + settings.field + "' align='" + settings.align + "' style='" + settings.style + "'>" + settings.title + "</th>").data("settings", settings).appendTo(tr);

 42             }

 43         });

 44     }

 45     function loadDatas(sldatagrid, datas) {

 46         $("tbody", sldatagrid).remove();

 47         $(sldatagrid).append("<tbody></tbody>");

 48         var thead = $("thead", sldatagrid);

 49         var theadtr = $("tr", thead);

 50         var tbody = $("tbody", sldatagrid);

 51         $.each(datas, function(i, n) {

 52             n.ck = false;

 53             var tr = $("<tr>", {

 54                 mouseenter : function() {

 55                     if (!$(this).hasClass("sldatagrid-row-selected")) {

 56                         $(this).addClass("sldatagrid-row-enter");

 57                     }

 58                     $(sldatagrid).data("property").enterRowIndex = $(this).prevAll().length;

 59                 },

 60                 mouseleave : function() {

 61                     $(this).removeClass("sldatagrid-row-enter");

 62                 },

 63                 click : function() {

 64                 }

 65             }).data("bindData", n).appendTo(tbody);

 66             $("th", theadtr).each(function() {

 67                 var field = $(this).attr('field');

 68                 if ($(this).data("settings").hidden) {

 69                     $("<td>", {

 70                         "class" : "sldatagrid-row-cell",

 71                         style : "display:none;",

 72                         click : function() {

 73                         }

 74                     }).text(n[field]).appendTo(tr);

 75                 } else {

 76                     if ($(this).data("settings").html == undefined || $(this).data("settings").html.length == 0) {

 77                         if (field == "ck") {

 78                             $("<td class='sldatagrid-row-check' align='center'></td>").appendTo(tr);

 79                             $("<input>", {

 80                                 type : "checkbox",

 81                                 click : function() {

 82                                     if (!$(sldatagrid).data("settings").singleSelect) {

 83                                         tr.toggleClass("sldatagrid-row-selected");

 84                                         if (tr.hasClass("sldatagrid-row-selected")) {

 85                                             $("td :checkbox", tr).attr("checked", "checked");

 86                                         } else {

 87                                             $("td :checkbox", tr).removeAttr("checked");

 88                                         }

 89                                         if ($("tr td input:checked", tbody).length == $("tr", tbody).length) {

 90                                             $(":checkbox", theadtr).attr("checked", "checked");

 91                                         } else {

 92                                             $(":checkbox", theadtr).removeAttr("checked");

 93                                         }

 94                                     } else {

 95                                         if (!tr.hasClass("sldatagrid-row-selected")) {

 96                                             $("td :checkbox", $("tr.sldatagrid-row-selected", tbody)).removeAttr("checked");

 97                                             $("tr.sldatagrid-row-selected", tbody).removeClass("sldatagrid-row-selected");

 98                                             tr.addClass("sldatagrid-row-selected");

 99                                             $("td :checkbox", tr).attr("checked", "checked");

100                                         } else {

101                                             return false;

102                                         }

103                                     }

104                                 }

105                             }).appendTo($("td", tr));

106                         } else {

107                             $("<td>", {

108                                 "class" : "'sldatagrid-row-cell",

109                                 click : function() {

110                                     if (!$(sldatagrid).data("settings").singleSelect) {

111                                         $(this).parent().toggleClass("sldatagrid-row-selected");

112                                         if ($(this).parent().hasClass("sldatagrid-row-selected")) {

113                                             $("td :checkbox", $(this).parent()).attr("checked", "checked");

114                                         } else {

115                                             $("td :checkbox", $(this).parent()).removeAttr("checked");

116                                         }

117                                         if ($("tr td input:checked", tbody).length == $("tr", tbody).length) {

118                                             $(":checkbox", theadtr).attr("checked", "checked");

119                                         } else {

120                                             $(":checkbox", theadtr).removeAttr("checked");

121                                         }

122                                     } else {

123                                         if (!$(this).parent().hasClass("sldatagrid-row-selected")) {

124                                             $("td :checkbox", $("tr.sldatagrid-row-selected", tbody)).removeAttr("checked");

125                                             $("tr.sldatagrid-row-selected", tbody).removeClass("sldatagrid-row-selected");

126                                             tr.addClass("sldatagrid-row-selected");

127                                             $("td :checkbox", tr).attr("checked", "checked");

128                                         }

129                                     }

130                                 }

131                             }).text(n[field]).appendTo(tr);

132                         }

133                     } else {

134                         $("<td>", {

135                             "class" : "sldatagrid-row-custom",

136                             click : function() {

137 

138                             }

139                         }).appendTo(tr).html($(this).data("settings").html);

140                     }

141                 }

142             });

143         });

144     }

145     function insertData(sldatagrid, index, data) {

146         var thead = $("thead", sldatagrid);

147         var theadtr = $("tr", thead);

148         var tbody = $("tbody", sldatagrid);

149         var tr = $("<tr>", {

150             mouseenter : function() {

151                 if (!$(this).hasClass("sldatagrid-row-selected")) {

152                     $(this).addClass("sldatagrid-row-enter");

153                 }

154                 $(sldatagrid).data("property").enterRowIndex = $(this).prevAll().length;

155             },

156             mouseleave : function() {

157                 $(this).removeClass("sldatagrid-row-enter");

158             },

159             click : function() {

160             }

161         }).data("bindData", data);

162         if ($("tr", tbody).length > 0) {

163             $("tr", tbody).eq(index).before(tr);

164         } else {

165             tbody.append(tr);

166         }

167         $("th", theadtr).each(function() {

168             var field = $(this).attr('field');

169             if ($(this).data("html") == undefined || $(this).data("html").length == 0) {

170                 if (field == "ck") {

171                     $("<td class='sldatagrid-row-check' align='center'></td>").appendTo(tr);

172                     $("<input>", {

173                         type : "checkbox",

174                         click : function() {

175                             if (!$(sldatagrid).data("settings").singleSelect) {

176                                 tr.toggleClass("sldatagrid-row-selected");

177                                 if (tr.hasClass("sldatagrid-row-selected")) {

178                                     $("td :checkbox", tr).attr("checked", "checked");

179                                 } else {

180                                     $("td :checkbox", tr).removeAttr("checked");

181                                 }

182                                 if ($("tr td input:checked", tbody).length == $("tr", tbody).length) {

183                                     $(":checkbox", theadtr).attr("checked", "checked");

184                                 } else {

185                                     $(":checkbox", theadtr).removeAttr("checked");

186                                 }

187                             } else {

188                                 if (!tr.hasClass("sldatagrid-row-selected")) {

189                                     $("td :checkbox", $("tr.sldatagrid-row-selected", tbody)).removeAttr("checked");

190                                     $("tr.sldatagrid-row-selected", tbody).removeClass("sldatagrid-row-selected");

191                                     tr.addClass("sldatagrid-row-selected");

192                                     $("td :checkbox", tr).attr("checked", "checked");

193                                 } else {

194                                     return false;

195                                 }

196                             }

197                         }

198                     }).appendTo($("td", tr));

199                 } else {

200                     $("<td>", {

201                         "class" : "'sldatagrid-row-cell",

202                         click : function() {

203                             if (!$(sldatagrid).data("settings").singleSelect) {

204                                 $(this).parent().toggleClass("sldatagrid-row-selected");

205                                 if ($(this).parent().hasClass("sldatagrid-row-selected")) {

206                                     $("td :checkbox", $(this).parent()).attr("checked", "checked");

207                                 } else {

208                                     $("td :checkbox", $(this).parent()).removeAttr("checked");

209                                 }

210                                 if ($("tr td input:checked", tbody).length == $("tr", tbody).length) {

211                                     $(":checkbox", theadtr).attr("checked", "checked");

212                                 } else {

213                                     $(":checkbox", theadtr).removeAttr("checked");

214                                 }

215                             } else {

216                                 if (!$(this).parent().hasClass("sldatagrid-row-selected")) {

217                                     $("td :checkbox", $("tr.sldatagrid-row-selected", tbody)).removeAttr("checked");

218                                     $("tr.sldatagrid-row-selected", tbody).removeClass("sldatagrid-row-selected");

219                                     tr.addClass("sldatagrid-row-selected");

220                                     $("td :checkbox", tr).attr("checked", "checked");

221                                 }

222                             }

223                         }

224                     }).text(data[field]).appendTo(tr);

225                 }

226             } else {

227                 $("<td>", {

228                     "class" : "sldatagrid-row-custom",

229                     click : function() {

230 

231                     }

232                 }).appendTo(tr).html($(this).data("settings").html);

233             }

234         });

235     }

236     function checkRow(sldatagrid, index) {

237         var tr = $("tbody tr", sldatagrid);

238         if ($(sldatagrid).data("settings").singleSelect) {

239             tr.removeClass("sldatagrid-row-selected");

240             $("td :checkbox", tr).removeAttr("checked");

241         }

242         tr = tr.eq(index);

243         tr.addClass("sldatagrid-row-selected");

244         $("td :checkbox", tr).attr("checked", "checked");

245     }

246     function unselectAll(sldatagrid) {

247         var tr = $("tbody tr", sldatagrid);

248         tr.removeClass("sldatagrid-row-selected");

249         $("td :checkbox", tr).removeAttr("checked");

250     }

251     $.fn.sldatagrid = function(options, params) {

252         if ($.type(options) == "string") {

253             var method = $.fn.sldatagrid.methods[options];

254             if (method) {

255                 return method(this, params);

256             } else {

257                 return null;

258             }

259         }

260         var settings = {};

261         $.extend(settings, $.fn.sldatagrid.defaults, options);

262         $(this).data("settings", settings).data("property", $.fn.sldatagrid.property);

263         $(this).attr({

264             border : 0,

265             cellpadding : 0,

266             cellspacing : 0,

267             "class" : settings.cssClass,

268             style : settings.style

269         });

270         if (settings.columns) {

271             loadColumns(this, settings.columns);

272         }

273         if (settings.datas) {

274             loadDatas(this, settings.datas);

275         }

276     };

277     $.fn.sldatagrid.methods = {

278         getClickRow : function(sldatagrid) {

279             return $("tbody tr", sldatagrid).eq($(sldatagrid).data("property").enterRowIndex).data("bindData");

280         },

281         getSelectedRows : function(sldatagrid) {

282             var selectedRows = new Array();

283             $("tbody tr.sldatagrid-row-selected", sldatagrid).each(function(i) {

284                 selectedRows[i] = $(this).data("bindData");

285             });

286             return selectedRows;

287         },

288         loadColumns : function(sldatagrid, columns) {

289             loadColumns(sldatagrid, columns);

290         },

291         loadDatas : function(sldatagrid, datas) {

292             loadDatas(sldatagrid, datas);

293         },

294         insertData : function(sldatagrid, params) {

295             insertData(sldatagrid, params.index, params.data);

296         },

297         checkRow : function(sldatagrid, index) {

298             checkRow(sldatagrid, index);

299         },

300         unselectAll : function(sldatagrid) {

301             unselectAll(sldatagrid);

302         },

303         getRow : function(sldatagrid, index) {

304             return $("tbody tr", sldatagrid).eq(index).data("bindData");

305         }

306     };

307     $.fn.sldatagrid.property = {

308         enterRowIndex : -1

309     };

310     $.fn.sldatagrid.defaults = {

311         cssClass : "sldatagrid",

312         style : "",

313         singleSelect : false,

314         columns : undefined,

315         datas : undefined

316     };

317     $.fn.sldatagrid.column = {

318         title : "",

319         field : "",

320         hidden : false,

321         align : "left",

322         style : "",

323         html : ""

324     };

325 })(jQuery);
View Code

sldatagrid.css

jQuery之自定义datagrid控件
 1 table,thead,tr,th,td,input {

 2     margin: 0;

 3     padding: 0;

 4     font-family: verdana;

 5     font-size: 12px;

 6 }

 7 

 8 .sldatagrid {

 9     border: solid 1px #B4B4B4;

10     border-collapse: collapse;

11     margin: 1px 0 0 0;

12 }

13 

14 .sldatagrid tr th {

15     height: 27px;

16     border: solid 1px #B4B4B4;

17     background-color: #F4F4F4;

18     word-break: keep-all;

19     white-space: nowrap;

20     padding: 1px 5px 1px 5px;

21 }

22 

23 .sldatagrid tr td {

24     height: 25px;

25     border: solid 1px #B4B4B4;

26     word-break: keep-all;

27     white-space: nowrap;

28     padding: 0 5px 0 5px;

29 }

30 

31 .sldatagrid-header-check {

32     width: 20px;

33 }

34 

35 .sldatagrid-header-custom {

36     width: auto;

37 }

38 

39 .sldatagrid-header-cell {

40     min-width: 50px;

41 }

42 

43 .sldatagrid-row-check {

44     width: 20px;

45 }

46 

47 .sldatagrid-row-custom {

48     

49 }

50 

51 .sldatagrid-row-cell {

52     padding: 0 5px 0 5px;

53     width: auto;

54 }

55 

56 .sldatagrid-row-selected {

57     background-color: #FCFCB6;

58 }

59 

60 .sldatagrid-row-enter {

61     background-color: #DDFAFB;

62 }
View Code

testsldatagrid.html

jQuery之自定义datagrid控件
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 2 <html>

 3 <head>

 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 5 <title></title>

 6 <link rel="stylesheet" href="sldatagrid.css" />

 7 <script type="text/javascript" src="jquery-1.7.2.min.js"></script>

 8 <script type="text/javascript" src="sldatagrid.js"></script>

 9 </head>

10 <body>

11     <table id="sl">

12     </table>

13     <script type="text/javascript">

14         $(function() {

15             $("#sl").sldatagrid({

16                 columns : [ {

17                     field : "ck",

18                     style : ""

19                 }, {

20                     title : "列1",

21                     field : "col1",

22                     align : "center",

23                     style : "width:100px;"

24                 }, {

25                     title : "列2",

26                     field : "col2",

27                     align : "center",

28                     style : "width:100px;"

29                 }, {

30                     title : "",

31                     field : "op",

32                     align : "center",

33                     style : "",

34                     html : "<input type='button' value='编辑' onclick='a()'/><input type='button' value='删除' onclick='b()'/>"

35                 } ],

36                 datas : [ {

37                     "col1" : "列1数据1",

38                     "col2" : "列2数据1"

39                 }, {

40                     "col1" : "列1数据2",

41                     "col2" : "列2数据2"

42                 }, {

43                     "col1" : "列1数据3",

44                     "col2" : "列2数据3"

45                 } ]

46             });

47         });

48         function a() {

49             var rowData = $("#sl").sldatagrid("getClickRow");

50             $.each(rowData, function(i, n) {

51                 alert(i + ":" + n)

52             });

53         }

54         function b() {

55             var rowDatas = $("#sl").sldatagrid("getSelectedRows");

56         }

57     </script>

58 </body>

59 </html>
View Code

API文档

表格属性:
 
属性名 属性值类型 描述 默认值
class string css样式 sldatagrid
style string 应用到表格整体的样式 width:auto;
singleSelect bool 如果为true,则只允许选择一行 false
columns array 列配置对象 undefined
datas array 数据 undefined
 
列属性:
 
属性名 属性值类型 描述 默认值
title string 列标题
field string 列字段("ck":checkbox列)
hidden bool 是否隐藏 false
align string 水平位置("center","left","right") "left"
style string 列样式
html string 自定义html
 
方法:
 
方法名 参数 返回值 描述
getClickRow 行数据对象 var rowData=$("#sl").sldatagrid("getClickRow");
rowData:
{
    "col1" : "列1数据1",
    "col2" : "列2数据1"
}
getSelectedRows 行数据对象数据 var rowDatas=$("#sl").sldatagrid("getSelectedRows");
rowDatas:
[
    {"col1" : "列1数据1", "col2" : "列2数据1"},
    {"col1" : "列1数据2", "col2" : "列2数据2"}
]
loadColumns 列数据 [{
    field:"ck",
    style:""
},{
    title:"列1",
    field:"col1",
    align:"center",
    style:"width:100px;"
},{
    title:"列2",
    field:"col2",
    align:"center",
    style:"width:100px;"
},{
    title:"",
    field:"",
    align:"center",
    style:"",
    html:"<input type='button' value='编辑' onclick='a()'/><input type='button' value='删除' onclick='b()'/>"
}]
loadDatas 行数据 [{
    "col1":"列1数据1",
    "col2":"列2数据1"
},{
    "col1":"列1数据2",
    "col2":"列2数据2"
}]
insertData

{

index:索引,

data:行数据

}

$("#dg").sldatagrid("insertData",{
  index:0,
  data:{
      "col1":"列1数据",
      "col2":"列2数据"
     }
});

checkRow

行索引

使指定行选中

$("#dg").sldatagrid("checkRow",0);

unselectAll

取消当前页所有行的选中状态

$("#dg").sldatagrid("unselectAll");

getRow

index

所有指定行数据

返回行数据

$("#dg").sldatagrid("getRow",0);

你可能感兴趣的:(datagrid)