??? 随着网络应用的不断发展,用户对富客户端的要求越来越完美,一个完美的界面操作往往可以将一个服务端数据展示的完美
?
??? 这几年来,jQuery一直是我热捧的javascript库,简单易懂,操作方便,无聊的时候就喜欢写一些控件,今天展示下
?tableGrid控件(非完整版)
?
?
??? 控件中有行编辑(面前有combox,timepick,checkbox,text4种编辑类型),列排序,自定义button,自定义xtype型编辑框,自定义列模式 (3种供选择),这些是我现在展示的代码中所拥有的功能(非完整版)。在完整版中还有行拖拽,列进度条显示,分页条进度条模式等等
?
??? 先来看看效果:
??? 
?
?
?? 为了对数组和对象操作更加方便,仿java编写了一个map方法,代码如下:
?
function Map() {
this.isMap = true;
var struct = function (key, value, other) {
this.key = key;
this.value = value;
this.other = other;
};
var put = function (key, value, other) {
for (var i = 0; i < this.arr.length; i++) {
if (this.arr[i].key === key) {
if (typeof other == Boolean || other === true) {
this.arr[i].value += "," + value;
} else {
this.arr[i].value = value;
this.arr[i].reg = other;
}
return;
}
}
this.arr[this.arr.length] = new struct(key, value, other);
};
var getOtherVal = function (key) {
for (var i = 0; i < this.arr.length; i++) if (this.arr[i].key === key) return this.arr[i].other;
return null;
};
var getValue = function (key) {
for (var i = 0; i < this.arr.length; i++) if (this.arr[i].key === key) return this.arr[i].value;
return null;
};
var remove = function (key) {
var v;
for (var i = 0; i < this.arr.length; i++) {
v = this.arr.pop();
if (v.key === key) continue;
this.arr.unshift(v);
}
};
var keySet = function () {
var keyArr = [];
for (var i = 0; i < this.arr.length; i++) {
var _key = this.arr[i].key;
keyArr[i] = _key;
}
return keyArr;
};
var valSet = function () {
var valArr = [];
for (var i = 0; i < this.arr.length; i++) {
var _val = this.arr[i].value;
valArr[i] = _val;
}
return valArr;
};
var alertKeyAndVal = function () {
var store = "";
for (var i = 0; i < this.arr.length; i++) {
var _val = this.arr[i].key;
var _key = this.arr[i].value;
store += "key:" + _key + ",val:" + _val;
}
return store;
};
var size = function () {
return this.arr.length;
};
var isEmpty = function () {
return this.arr.length <= 0;
};
this.arr = new Array();
this.getValue = getValue;
this.getOtherVal = getOtherVal;
this.put = put;
this.remove = remove;
this.size = size;
this.isEmpty = isEmpty;
this.keySet = keySet;
this.valSet = valSet;
this.alertKeyAndVal = alertKeyAndVal;
}
?
?
??? 再展示下jquery.tableGrid.js文件:
?
function Store(ps) {
this.url = ps.url;
this.JsonReader = ps.JsonReader;
var getUrl = function() {
return this.url;
}
var getReader = function() {
return this.JsonReader;
}
this.getUrl = getUrl;
this.getReader = getReader;
}
(function ($) {
$.fn.grid = $.grid = function (opt) {
var ps = $.extend({}, $.fn.grid.defaults, opt || {});
$.fn.grid.defaults = {
ele:'grid',
width:'650px',
selModel:'CheckModel',
dblUpdate:false,
async:true,
subJoin:'',
colModel:[],
method:'post',
dataType:'json',
titleBar:'',
rowHeight:27,
onClickRowEvent:function() {
},
toolBar:[],
PagingToolbar:{},
UpdataModel:{},
updataModel:"td",
hasBotton:false
};
var grid = this;
this.hideTd = new Map();
this.columSelectMap = new Map();
this.columCheckMap = new Map();
this.columFunMap = new Map();
this.columProgressMap = new Map();
this.toolbarMap = new Map();
this.totalMap = new Map();
this.rowHeight = ps.rowHeight;
this.disp = 0;
this.data = [];
this.widthArr = [];
this.RowData = [];
this.ajaxdata;
this.saveUrl = ps.UpdataModel.SaveUrl;
this.findSortKey;
ps.width.substring(ps.width.length - 1) == "%" ? this.widthtype = true : this.widthtype = false;
var removeArr = ['pFirst pFirstd','pPrev pPrevd','pNext pNextd','pLast pLastd','pFirstd','pPrevd','pNextd','pLastd','pFirst','pPrev','pNext','pLast'];
var fun = {
estimateBrowser: function() {
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
return Sys;
},
createBody:function(grid) {
grid.filterDiv = $('<div class="nBtn" style="left: 229px; top: 53px;"><div></div></div>').hide().appendTo(grid);
},
cssOperate:function(obj, css1, css2) {
obj.addClass(css1).removeClass(css2);
},
sortFun:function(rows, newDirection, oTable, column, flag) {
$.each(rows, function(index, row) {
if (flag)
row.sortKey = parseInt(grid.findSortKey($(row).find("td").eq(column)));
else
row.sortKey = grid.findSortKey($(row).find("td").eq(column));
});
rows.sort(function(a, b) {
if (a.sortKey < b.sortKey) {
return -newDirection;
} else if (a.sortKey > b.sortKey) {
return newDirection;
} else {
return 0;
}
});
$.each(rows, function(index, row) {
oTable.children("tbody").append(row);
row.sortKey = null;
});
},
createTitle:function(grid) {
if (ps.titleBar != '') {
grid.TitleHeight = 26;
var ftitle = document.createElement('div');
var ptogtitle = document.createElement('div');
$(fun.mDiv).addClass('mDiv').appendTo(grid);
$(ftitle).addClass('ftitle').html('<span>' + ps.titleBar + '</span>').appendTo(fun.mDiv);
}
},
createHr:function(grid) {
grid.total = false;
grid.HrHeight = 26;
var hTable = document.createElement('table');
$(fun.hDiv).addClass('hDiv').appendTo(grid);
var hrTitle = [];
hrTitle.push(' <tbody> <tr style="height:', 21, '" class="dataTableHead">');
if (ps.selModel == 'CheckModel' || ps.selModel == 'TdSelectionModel') {
if (grid.widthtype) hrTitle.push('<th class="checkbox sorted" width="33px" index="0">')
else hrTitle.push('<th class="grid-th checkbox sorted" width="33px" index="0">');
hrTitle.push(' <div align="center" style="overflow:hidden;"> <input type="checkbox" name="checkbox[]"/></div>');
hrTitle.push('</th>');
} else if (ps.selModel == 'RowSelectionModel') {
if (grid.widthtype) hrTitle.push('<th index="0" class="rownumber sorted" width="33px"><div style=" overflow:hidden;"></div></th>');
else hrTitle.push('<th index="0" class="grid-th rownumber sorted" width="33px"><div style=" overflow:hidden;"></div></th>');
}
if (ps.subJoin == "RowIndexModel") {
if (grid.widthtype) hrTitle.push('<th index="0" class="grid-th rownumber sorted" width="33px" align="left">编号</th>');
else hrTitle.push('<th index="0" class="grid-th rownumber sorted" width="33px" align="left">编号</th>');
}
for (var i = 0; i < ps.colModel.length; i++) {
var _class = '' , _hide = '' , _sorts = '';
if (i == 0) _class = 'sorted';
var col = ps.colModel[i];
if (col.total) {
grid.total = true;
grid.totalMap.put(col.name, col.total);
}
if (col.hide) {
_hide = 'none';
grid.hideTd.put(col.name, col.name)
}
if (col.sort) {
_sorts = 'sort'
}
var width;
if (col.width.toString().substring(col.width.toString().length - 2) == "px") {
width = parseInt(col.width.toString().substring(0, col.width.toString().length - 2));
} else {
width = col.width;
}
grid.widthArr[i] = width;
hrTitle.push('<th index="', i + 1, '" sort="', _sorts, '" class="grid-th ', col.sort, '" width="', width, '" name="', col.name, '" class="', _class, '" style="display:', _hide, ';position:static ;">');
hrTitle.push('<div style="text-align: ' + col.align + '; overflow:hidden;">' + col.display + '</div>');
hrTitle.push('</th>');
}
hrTitle.push(' </tr></tbody>');
$(hTable).addClass('dataTable');
$(hrTitle.join("")).appendTo(hTable);
$(hTable).width("100%").attr('cellpadding', 0).attr('cellspacing', 0).appendTo(fun.hDiv);
$("input[name='checkbox[]']", $(fun.hDiv)).click(function() {
$(this).attr("checked") == true ? grid.selectedRowByIndex() : grid.unselectedRowByIndex();
});
$("th:gt(0)", hTable).hover(function() {
// $(this).find("a").show();
}, function() {
// $(this).find("a").hide();
});
$("th[sort='sort']", hTable).each(function() {
var th = $(this);
var column = th.attr("index");
if ($(this).hasClass("string")) {
grid.findSortKey = function($cell) {
return $cell.find("div").html();
}
}
else if ($(this).hasClass("num")) {
grid.findSortKey = function($cell) {
var key = parseInt($cell.find("div").html());
return isNaN(key) ? 0 : parseInt(key);
}
}
else if ($(this).hasClass("data")) {
grid.findSortKey = function($cell) {
return Date.parse('1 ' + $cell.find("div").html());
}
}
th.click(function() {
if (grid.findSortKey) {
var oTable = $('table', fun.bDiv);
var aTRs = new Array;
var newDirection = 1;
var rows = oTable.find("tbody > tr").get();
if ($(this).hasClass(".sorted-asc") || (!$(this).hasClass(".sorted-asc") && !$(this).hasClass(".sorted-desc"))) {
if ($(this).hasClass(".sorted-asc")) {
newDirection = -1;
fun.sortFun(rows, newDirection, oTable, column, $(this).hasClass("num"));
$(this).removeClass("sorted-asc").addClass("sorted-desc");
fun.cssOperate($(this), "sorted-desc", "sorted-asc");
fun.cssOperate($(this).find("div"), "up", "dn");
} else if (!$(this).hasClass(".sorted-asc") && !$(this).hasClass(".sorted-desc")) {
newDirection = 1;
fun.sortFun(rows, newDirection, oTable, column, $(this).hasClass("num"));
$(this).addClass("sorted-asc");
fun.cssOperate($(this).find("div"), "dn", "up");
}
}
else if ($(this).hasClass(".sorted-desc")) {
$.each(grid.rawtype, function(index, row) {
oTable.children("tbody").append(row);
row.sortKey = null;
});
$(this).removeClass("sorted-desc").find("div").removeClass("dn up");
}
}
oTable.find("tbody > tr").removeClass('erow').each(function(index, n) {
if (index % 2 && ps.stripe) $(this).addClass('erow');
});
$(this).siblings().find("div").removeClass("dn up");
}).hover(function() {
$(this).addClass("hover");
}, function() {
$(this).removeClass("hover");
});
})
},
createGbody:function(grid) {
grid.bTable = document.createElement('table');
grid.bTable.className = 'dataTable';
grid.tbody = document.createElement('tbody');
// $(fun.bDiv).height(ps.PagingToolbar.pageSize * 27 - 1).addClass('bDiv').appendTo(grid);
$(fun.bDiv).height(ps.PagingToolbar.pageSize * 27 - 1).addClass('bDiv').appendTo(grid);
grid.pageSize = ps.PagingToolbar.pageSize;
var Store = ps.PagingToolbar.store;
grid.url = Store.getUrl();
grid.page = 1;
grid.ajaxdata = Store.data;
for (var i = 0; i < ps.PagingToolbar.pageSize; i++) {
var tr = document.createElement('tr');
var $tr = $(tr).appendTo(grid.tbody);
var td = document.createElement('td');
if (ps.selModel == 'CheckModel' || ps.selModel == 'TdSelectionModel') {
$(td).css({'padding-top':'2px'}).appendTo(tr);
$('<div style="text-align: center; overflow:hidden;"><input type="checkbox" name="' + i + '"/></div>').click(function() {
if (ps.selModel == 'TdSelectionModel') {
}
else $(this).attr("checked") == true ? $(this).parent().parent().addClass('trSelected') : $(this).parent().parent().removeClass('trSelected');
}).appendTo(td);
if (ps.subJoin == "RowIndexModel") $(td).appendTo(tr);
} else if (ps.selModel == 'RowSelectionModel') {
$(td).css({'padding-top':'2px'}).appendTo(tr);
}
$(td).width('33px').attr('align', 'center');
for (var j = 0; j < ps.colModel.length; j++) {
var col = ps.colModel[j];
var widthStr = "";
var td = $('<td width=' + grid.widthArr[j] + ' align=' + col.align + '><div class="td" style="text-align: ' + col.align + '; overflow:hidden;"></div></td>')
if (col.checkModel) {
grid.columCheckMap.put(col.name, j)
} else if (typeof col.selectModel != 'undefined') {
grid.columSelectMap.put(col.name, j);
$(td).attr({'selecter':true,'key':col.key});
} else if (jQuery.isFunction(col.renderer)) {
grid.columFunMap.put(col.name, j)
} else if (col.progressBarModel) {
grid.columProgressMap.put(col.name, j);
}
if (col.total == 'int' || col.total == 'float') {
$(td).attr('total', col.total);
}
$(td).click(function() {
var $tr = $(this).parent();
if (ps.selModel == 'TdSelectionModel') {
$tr.siblings().find('td:eq(0)').find('input').attr('checked', false);
grid.getAllTdObj().not($(this).addClass('tdSelected')).removeClass('tdSelected')
} else {
var $sibings = $tr.addClass('trSelected').siblings().removeClass('trSelected').find('td:eq(0)').find('input').attr('checked', false);
}
$('td:eq(0)', $tr).find('input').attr('checked', true);
}).attr({
'name':col.name,
'editor':col.editor,
'editoring':'false',
'align':col.align
}).appendTo(tr);
if (grid.hideTd.getValue(col.name) != null) $(td).hide(); //.css('width',col.width)
}
grid.RowData[i] = $tr;
$tr.hide();
}
$("tr", $(grid.tbody)).click(function() {
var index = $(this).attr("index");
ps.onClickRowEvent(grid.data[index]);
});
fun.bind(grid.url, grid.ajaxdata, 1, true, grid);
$(grid.tbody).appendTo(grid.bTable);
$(grid.bTable).width("100%").attr('cellpadding', 0).attr('cellspacing', 0).appendTo(fun.bDiv);
grid.getEditorsTd().attr("editored", "true");
},
createTotal:function(grid) {
fun.tDiv.className = 'toDiv';
var table = document.createElement('table');
var total = [];
total.push(' <tr style="height:26px;">');
if (grid.widthtype)
total.push('<th width="3%"> </th>');
else
total.push('<th width="25"> </th>');
for (var i = 0; i < ps.colModel.length; i++) {
var _class = '', _hide = '';
if (i == 0) _class = 'sorted';
var col = ps.colModel[i];
if (col.hide) {
_hide = 'none'
}
if (col.total) {
total.push('<th total="total" width="' + col.width + '" name="' + col.name + '" class="' + _class + '" align="' + col.align + '" style="display:' + _hide + ';">0</th>');
} else {
total.push('<th width="' + col.width + '" name="' + col.name + '" class="' + _class + '" align="' + col.align + '" style="display:' + _hide + ';"></th>');
}
}
total.push(' </tr>');
$(total.join("")).appendTo(table);
$(table).width("100%").appendTo(fun.tDiv);
$(fun.tDiv).appendTo(grid)
},
createBotton:function(grid) {
var span = document.createElement('span');
$(span).appendTo(fun.vGrip);
$(fun.vGrip).addClass('vGrip').appendTo(grid);
},
dragStart:function(dragtype, e, obj) {
if (dragtype == 'vresize') return {
sy: e.pageY,
sx: e.pageX
};
},
createPager:function(grid) {
fun.pDiv.className = 'pDiv';
fun.pDiv.innerHTML = '<div class="pDiv2" style="width:"'+(parseInt(grid.width())-2)+'"px;margin-right:2px"></div>';
var html = '<div class="pGroup"></div>' +
'<div class="pGroup">' +
'<div name="pFirst" class="pFirst pButton"><span></span></div>' +
'<div name="pPrev" class="pPrev pButton"><span></span></div>' +
'</div>' +
'<div class="btnseparator"></div>' +
'<div class="pGroup"><span class="pcontrol">第 <input disabled="disabled" class="input" style="margin-top:2px;" type="text" size="2" value="1" /> 页,共 <span class="count"> 1 </span>页</span></div>' +
'<div class="btnseparator"></div>' +
'<div class="pGroup">' +
'<div name="pNext" class="pNext pButton"><span></span></div>' +
'<div name="pLast" class="pLast pButton"><span></span></div>' +
'</div>' +
'<div class="btnseparator"></div>' +
'<div class="pGroup" style="float:right;"><span class="pcontrol">共检测到 </span><span class="pcontrol countS">0</span><span class="pcontrol"> 条数据</span></div>';//共检测到10条数据
$('div', fun.pDiv).html(html);
$(fun.pDiv).appendTo(grid);
$('div[name="pFirst"]', fun.pDiv).click(function() {
if (!$(this).hasClass("pFirstd")) {
fun.changePage('first')
}
});
$('div[name="pPrev"]', fun.pDiv).click(function() {
if (!$(this).hasClass("pPrevd")) {
fun.changePage('prev')
}
});
$('div[name="pNext"]', fun.pDiv).click(function() {
if (!$(this).hasClass("pNextd")) {
fun.changePage('next')
}
});
$('div[name="pLast"]', fun.pDiv).click(function() {
if (!$(this).hasClass("pLastd")) {
fun.changePage('last')
}
});
$('.pReload', fun.pDiv).click(function() {
fun.bind(grid.url, grid.ajaxdata, grid.page, false, grid)
});
},
createToolbar:function(grid) {
if (ps.toolBar.length != 0) {
grid.toolbarHeight = 26;
fun.tbDiv.className = 'tDiv';
var tDiv2 = document.createElement('div');
tDiv2.className = 'tDiv2';
$(tDiv2).appendTo(fun.tbDiv);
for (var i = 0; i < ps.toolBar.length; i++) {
var button = ps.toolBar[i];
var buttonarr = [];
if (button.xtype == 'button') {
buttonarr.push('<div id="' + button.id + '" class="fbutton" tip="' + button.tooltip + '">');
buttonarr.push(' <div>');
buttonarr.push(' <span><input type="image" src="' + button.iconCls + '" style="width:17px;height:17px;"/></span><span style="padding-left:1px;padding-top:5px">' + button.text + '</span>');
buttonarr.push(' </div>');
buttonarr.push('</div>');
var $but = $(buttonarr.join("")).appendTo(tDiv2);
$but.hover(function() {
$(this).addClass("fbOver");
}, function() {
$(this).removeClass("fbOver");
});
fun.buttonEvent(i, $but);
grid.toolbarMap.put(button.id, i);
} else if (button.xtype == 'text') {
$('<div class="input"><span>' + button.label + ' </span><input id="' + button.id + '"/></div>').appendTo(tDiv2);
} else if (button.xtype == 'tbseparator' || button == '-') {
$(tDiv2).append('<div class="toolber-btnseparator"></div>');
} else if (button.xtype == 'check') {
$('<div class="check"><span>' + button.label + ' </span><input type="checkbox" id="' + button.id + '"/></div>').appendTo(tDiv2);
} else if (button.xtype == "combox") {
var div = $('<div class="input"><span>' + button.label + ' </span><input id="' + button.id + '"/></div>').appendTo(tDiv2);
div.find('input').Jcombox(button.combox);
}
}
if (ps.titleBar == '') $(fun.tbDiv).css({'border-top':'1px solid #99BBE8'})
$(fun.tbDiv).appendTo(grid);
}
},
buttonEvent:function(index, button) {
button.click(function() {
ps.toolBar[index].handler();
})
},
setData:function(row, colum, val, grid) {
var map = new Map();
map = grid.data[row];
map.remove(colum);
map.put(colum, val);
},
input:function(tr, index, centext, display, isArray) {
if (index % 2 && ps.stripe) tr.eq(index).addClass('erow');
var map = new Map();
if (ps.selModel == 'CheckModel' || ps.selModel == 'TdSelectionModel') {
$('td:first input', tr).attr('checked', false);
if (ps.subJoin == "RowIndexModel") {
$('td:eq(1)', tr.eq(index)).html(((grid.page - 1) * ps.PagingToolbar.pageSize) + index + 1);
}
} else if (ps.selModel == 'RowSelectionModel') {
$('td:first', tr.eq(index)).html(((grid.page - 1) * ps.PagingToolbar.pageSize) + index + 1);
}
var gt = 0;
if (ps.subJoin == "RowIndexModel") {
gt = 1;
} else {
gt = 0;
}
grid.RowData[index] = tr.eq(index);//...
$('td:gt(' + gt + ')', tr.eq(index).attr('index', index).removeClass('trSelected').show()).each(function(i) {
if ($(this).attr('editor') == 'true')$(this).attr('editored', 'true');
var name = ps.colModel[i].name;
if (grid.columFunMap.getValue(name) != null) {
$("div", $(this)).html(ps.colModel[grid.columFunMap.getValue(name)].renderer(isArray ? centext.getValue(name) : centext[name], index));
map.put(name, isArray ? centext.getValue(name) : centext[name]);
} else if (grid.columCheckMap.getValue(name) != null) {
var ch = ps.colModel[grid.columCheckMap.getValue(name)].checkModel;
var yes = ch.yes;
var no = ch.no;
var ischeck;
isArray ? centext.getValue(name) : centext[name] == yes ? ischeck = "checked=true" : ischeck = "";
$("<input type='checkbox' " + ischeck + " name='checkbox_disabled'/>").attr("disabled", "true").appendTo($(this).find("div").html(""));
map.put(name, isArray ? centext.getValue(name) : centext[name]);
} else if (grid.columProgressMap.getValue(name) != null) {
var width = $(this).find("div").width() * (parseInt(centext[name]) / 100);
var tdiv = $('<div class="x-progress-inner"><div class="x-progress-bar" style="height: 16px; width: ' + (width - 3) + 'px;"><font color="#FFFFF" style=""></font></div></div>').appendTo($(this).find("div:eq(0)").html(""));
map.put(name, isArray ? centext.getValue(name) : centext[name]);
} else {
var dataType = ps.colModel[i].DType;
if (dataType == "date") {
var year,month,day,date,hours,minutes,seconds;
var time;
if (centext[name] != "" && centext[name] != null) {
$.each(centext[name], function(i, c) {
switch (i) {
case "date":date = c;break;
case "day":day = c;break;
case "hours":hours = c;break;
case "minutes":minutes = c;break;
case "month":month = c;break;
case "seconds":seconds = c;break;
case "year":year = c;break;
}
});
time = parseInt(1900 + year) + "-" + parseInt(month + 1) + "-" + parseInt(day + 1) + " " + hours + ":" + minutes + ":" + seconds;
} else {
time = "――";
}
$(this).find("div").text(time);
map.put(name, time);
} else {
$(this).find("div").text(isArray ? centext.getValue(name) : centext[name]);
map.put(name, isArray ? centext.getValue(name) : centext[name]);
}
}
var tot = grid.totalMap.getValue(name);
if (tot != null) {
var val = isArray ? centext.getValue(name) : centext[name];
var value = $('th[name="' + name + '"]', $(fun.tDiv)).text();
var total = 0;
if (tot == 'int') {
total = parseInt(value) + parseInt(val);
} else if (tot == 'float') {
total = parseFloat(value) + parseFloat(val);
}
$('th[name="' + name + '"]', $(fun.tDiv)).text(total);
}
});
grid.data[index] = map;
display++;
return display;
},
addData:function(data, firstinit, internal) {
var tr = $('tbody tr', fun.bDiv);
if (!internal) {
var temp = 1;
$('th[total="total"]', $(fun.tDiv)).text(0);
$.each(data, function() {
grid.msgCount = data.totalProperty;
grid.pageCount = Math.ceil((grid.msgCount / grid.pageSize));
if (firstinit) {
grid.page = 1;
grid.pageCount == 0 || grid.pageCount == 1 ? fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[6],removeArr[7]]) : fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[10],removeArr[11]]);
}
$('.count', fun.pDiv).html(grid.pageCount);
$('.input', fun.pDiv).val(grid.page);
if (temp == 2) {
var display = 0;
$.each(data.root, function(index, centext) {
display = fun.input(tr, index, centext, display, false);
});
grid.display = display;
display == 0 ? $('.pPageStat', $(fun.pDiv)).html(ps.PagingToolbar.emptyMsg) : $('.pPageStat', $(fun.pDiv)).html('');
for (var dis = parseInt(display); dis < grid.pageSize; dis++) tr.eq(dis).hide();
grid.data = grid.data.slice(0, display);
}
temp++;
})
} else {
var display = 0;
$.each(data, function(index, n) {
display = disp = fun.input(tr, index, n, display, true);
});
for (var dis = parseInt(display); dis < grid.pageSize; dis++) tr.eq(dis).hide();
}
$("input[name='checkbox[]']", $(fun.hDiv)).attr("checked", false);
if (grid.page == grid.pageCount) {
fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[6],removeArr[7]])
} else if (grid.page < grid.pageCount && grid.page != 1) {
fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[10],removeArr[11]])
}
},
changePage:function(ctype) {
if (ctype == "first") {
grid.page = 1;
fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[8],removeArr[9]]);
} else if (ctype == "prev") {
if (grid.page > 1) {
grid.page == 2 ? fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[8],removeArr[9]]) : fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[10],removeArr[11]]);
grid.page = grid.page - 1;
} else {
fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[10],removeArr[1]]);
}
} else if (ctype == "next") {
if (grid.page < grid.pageCount) {
(grid.page == grid.pageCount - 1) ? fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[6],removeArr[7]]) : fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[10],removeArr[11]]);
grid.page = grid.page + 1;
}
} else if (ctype == "last") {
grid.page = grid.pageCount;
fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[6],removeArr[7]]);
}
$('.input', fun.pDiv).val(grid.page);
fun.bind(grid.url, grid.ajaxdata, grid.page, false, grid);
},
changeCls:function(remover, add) {
$('div[name="' + removeArr[8] + '"]', fun.pDiv).removeClass(remover[0]).addClass(add[0]);
$('div[name="' + removeArr[9] + '"]', fun.pDiv).removeClass(remover[1]).addClass(add[1]);
$('div[name="' + removeArr[10] + '"]', fun.pDiv).removeClass(remover[2]).addClass(add[2]);
$('div[name="' + removeArr[11] + '"]', fun.pDiv).removeClass(remover[3]).addClass(add[3]);
},
createLoader:function(grid) {
var bDivheight = $(fun.bDiv).height();
var div = document.createElement('div');
div.innerHTML = 'loading...';
fun.mkDiv.className = 'loadmask';
fun.lDiv.className = 'loadmask-msg';
$(div).appendTo(fun.lDiv);
$(fun.lDiv).appendTo("body");
},
TrsDblclick:function(grid) {
if (ps.updataModel == "tr") {
var AllTrs = grid.getAllTrObj().dblclick(function() {
var editorTrs = $(this).attr("iseditor", "true").find('td:gt(0)').each(function(i, n) {
fun.TdDblclick($(this));
})
})
} else {
grid.getAllTdObj().dblclick(function() {
var td = $(this);
td.parent().attr('iseditor', 'true');
if (td.attr("editor") == 'true') {
fun.TdDblclick(td);
td.parent().attr("iseditor", 'true');
}
})
}
},
TdDblclick:function(ele) {
if (ele.attr("editored") == 'true') {
var index = ele.parent().attr('index');
var text = ele.text();
var name = ele.attr('name');
var val = grid.data[index].getValue(name);
if (ele.attr('selecter')) {
var input = $("<input class=\"x-form-text x-form-field\"/>").attr("value", val);
if (fun.estimateBrowser().ie == '8.0')
input.css({
"width":parseInt(ele.width() - 30) + "px",
"height":15
});
else if (typeof fun.estimateBrowser().ie != 'undefined' && fun.estimateBrowser().ie != '8.0')
input.css({
"width":parseInt(ele.width() - 30) + "px",
"height":17
});
else
input.css({
"width":parseInt(ele.width() - 30) + "px",
"height":15
});
ele.attr("editored", "false").find("div").html("").append(input);
$(input).Jcombox(ps.colModel[grid.columSelectMap.getValue(name)].selectModel);
} else {
if (grid.columCheckMap.getValue(name) != null) {
ele.attr("editored", "false").find("input").attr("disabled", false);
} else {
var input = $("<input />").css({
"width":ele.width() - 30,
"height":18
}).attr("value", val);
ele.attr("editored", "false").find("div").html("").append(input);
}
}
}
},
bind:function(url, data, pageIndex, firstinit, grid) {
var _url = "";
var _data;
url.substring(url.length - 1) == "&" ? _url = url + 'pageIndex=' + pageIndex + '&pageSize=' + grid.pageSize : _url = url + '?pageIndex=' + pageIndex + '&pageSize=' + grid.pageSize;
data == "" ? _data = "" : _data = data;
$.ajax({
type: ps.method,
url: _url,
data:_data,
dataType: ps.dataType,
timeout:30000,
error:function(err) {
alert(err)
},
beforeSend: function() {
$(fun.lDiv).css({
top: $(fun.hDiv).offset().top + (parseInt(ps.PagingToolbar.pageSize * 30) - 30) / 2,
left:grid.offset().left + (grid.width() - 110) / 2
}).show();
},
complete: function() {
$(fun.lDiv).hide();
if (grid.pageCount == 0 || grid.pageCount == 1) {
fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[6],removeArr[7]]);
} else {
if (grid.page == 1) {
fun.changeCls(removeArr, [removeArr[4],removeArr[5],removeArr[10],removeArr[11]]);
} else if (grid.page > 1 && grid.page < grid.pageCount) {
fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[10],removeArr[11]]);
} else if (grid.page == grid.pageCount) {
fun.changeCls(removeArr, [removeArr[8],removeArr[9],removeArr[6],removeArr[7]]);
}
}
grid.rawtype = $('table', fun.bDiv).find("tbody > tr");
$(".countS", fun.pDiv).html(grid.msgCount);
},
success: function(data) {
grid.disp = fun.addData(data, firstinit);
},
error: function(data) {
fun.bDiv.find("table").find("tr").hide();
}
});
},
hideTd:function(name) {
$('td[name="' + name + '"]', $(fun.bDiv)).hide();
$('th[name="' + name + '"]', $(fun.hDiv)).hide();
$('div[name="' + name + '"]', $(fun.pDrag)).hide();
},
displayTd:function(name) {
$('td[name="' + name + '"]', $(fun.bDiv)).show();
$('th[name="' + name + '"]', $(fun.hDiv)).show();
$('div[name="' + name + '"]', $(fun.pDrag)).show();
}
};
this.selectedRowByIndex = function(index) {
if (typeof index == "undefined") {
$("tr", $(fun.bDiv)).addClass('trSelected').find("td:eq(0)").find('input').attr('checked', true);
} else {
$("tr[index='" + index + "']", $(fun.bDiv)).addClass('trSelected').find("td:eq(0)").find('input').attr('checked', true);
}
};
this.unselectedRowByIndex = function(index) {
if (typeof index == "undefined") {
$("tr", $(fun.bDiv)).removeClass('trSelected').find("td:eq(0)").find('input').attr('checked', false);
} else {
$("tr[index='" + index + "']", $(fun.bDiv)).removeClass('trSelected').find("td:eq(0)").find('input').attr('checked', false);
}
};
this.selectAll = function() {
this.selectedRowByIndex();
};
this.evaluate = function(row, colum, valOfInput, Tdele) {
var grid = this;
var val;
if (grid.columFunMap.getValue(colum) != null) {
$("div", Tdele).html(ps.colModel[grid.columFunMap.getValue(colum)].renderer(valOfInput, row));
val = valOfInput;
} else if (grid.columCheckMap.getValue(colum) != null) {
$("div", Tdele).find("input").attr("disabled", true);
var ch = ps.colModel[grid.columCheckMap.getValue(colum)];
Tdele.find("input").attr("checked") == true ? val = ch.checkModel.yes : val = ch.checkModel.no;
} else if(grid.columSelectMap.getValue(colum) != null){
val = $(Tdele.find("input")).attr("key");
$("div", Tdele).html(valOfInput);
} else {
$("div", Tdele).html(valOfInput);
val = valOfInput;
}
if (Tdele.attr('total') == 'int' || Tdele.attr('total') == 'float') {
var data_val = grid.data[row].getValue(colum);
var total_val = $('th[name="' + colum + '"]', $(fun.tDiv)).text();
if (Tdele.attr('total') == 'int') {
$('th[name="' + colum + '"]', $(fun.tDiv)).text(parseInt(total_val) - parseInt(data_val) + parseInt(val));
} else {
$('th[name="' + colum + '"]', $(fun.tDiv)).text(parseFloat(total_val) - parseFloat(data_val) + parseFloat(val));
}
}
fun.setData(row, colum, val, grid);
Tdele.attr("editored", "true");
var sjon = "";
typeof Tdele.attr("key") != "undefined" ? sjon = "\"" + Tdele.attr("key") + "\":\"" + val + "\"" : sjon = "\"" + Tdele.attr("name") + "\":\"" + val + "\"";
return sjon;
};
this.saveEvent = function () {
var returnStr;
var grid = this;
var saveby = ps.UpdataModel.saveby;
var data = "[{";
var trs = $(fun.bDiv).find("tr[iseditor='true']").each(function (_index, n) {
var arr = [];
var tr = $(this).attr("iseditor", "false");
var index = grid.getRowNo(tr);
for (var i = 0; i < saveby.length; i++) {
var val = grid.getRow(index).getValue(saveby[i]);
data = data + "\"" + saveby[i] + "\":\"" + val + "\",";
}
var map = new Map();
var temp = 0;
var tr_childrens = $(this).find("td[editor='true']").each(function (i) {
var thisTd = $(this);
var type = thisTd.attr("reg");
if (thisTd.attr("editored") == "false") {
var colum = thisTd.attr("name");
var input_val = thisTd.find("div").find("input").val();
arr[temp] = grid.evaluate(index, colum, input_val, thisTd);
temp ++;
}
thisTd.attr("editored", "true");
});
arr.length != 0 ? (data = data + arr + "},{") : "";
var index = $(this).find("td:eq(0)").find("div").html();
grid.data[index - 1] = map;
});
var source = data.substring(0, data.length - 2) + "]";
if (source == "]") {
$.JMessage("message4-" + ps.ele, "温馨提示:", "请您确定是否有信息需要保存", "question");
} else {
$.ajax({
type: "post",
url: grid.saveUrl,
data:'saveSource=' + source,
timeout:30000,
async:false,
success: function(data) {
returnStr = data;
}
});
}
return returnStr;
};
this.setSaveUrl = function(saveurl) {
this.saveUrl = saveurl;
};
this.deleteEvent = function () {
var grid = this;
var returnStr;
var deleteby = ps.UpdataModel.deleteby;
if (!grid.hasSelected()) {
$.JMessage("message1-" + ps.ele, "温馨提示:", "你没有选择行", "question");
} else {
var source = "{";
var arr = grid.getSelectedRowIndexs();
for (var i = 0; i < arr.length; i++) {
for (var a = 0; a < deleteby.length; a++) {
a == deleteby.length - 1 ? source = source + "\"" + deleteby[a] + "\":\"" + grid.data[arr[i]].getValue(deleteby[a]) + "\"" : source = source + "\"" + deleteby[a] + "\":\"" + grid.data[arr[i]].getValue(deleteby[a]) + "\",";
}
i == arr.length - 1 ? source = source + "}" : source = source + "},{";
}
var deleteUrl = "";
var data = "deleteSource=[" + source + "]";
$.JMessage("message2-" + ps.ele, "温馨提示:", "你真的要删除选中的行吗?", "YNC", function(val) {
$.ajax({
type: "post",
url: ps.UpdataModel.DelUrl,
complete:function() {
if (arr.length == grid.display) {
if (grid.page > 1 && grid.page == grid.pageCount) grid.page = grid.page - 1;
$('.input', fun.pDiv).val(grid.page);
}
grid.msgCount = grid.msgCount - arr.length;
grid.pageCount = Math.ceil((grid.msgCount / grid.pageSize));
$('.count', fun.pDiv).html(grid.pageCount);
fun.bind(grid.url, grid.ajaxdata, grid.page, false, grid);
},
data: data,
async:false,
success: function(msg) {
returnStr = msg;
}
});
});
return returnStr;
}
};
this.addEvent = function(row) {
var grid = this;
if (this.data.length == ps.PagingToolbar.pageSize) this.data.pop();
var map = new Map();
$.each(row, function(i, n) {
map.put(i, n);
});
this.data.unshift(map);
fun.addData(this.data, false, true);
};
this.isSelect = function(tr) {
if ($('td:first', tr).find('input').attr("checked") == true) {
return true
} else {
return false
}
};
this.getRowNo = function(ele) {
return ele.attr('index');
};
this.getRow = function(index) {
return this.data[parseInt(index)];
};
this.getSelectedByCols = function(nameArr){
var grid = this;
var arr = grid.getSelectedRowIndexs();
for(var i=0;i<arr.length;i++){
grid.getRow(arr[i]);
}
},
this.getSelectedRowIndexs = function() {
var grid = this;
var i = 0;
var indexArr = [];
if (ps.selModel == 'CheckModel' || ps.selModel == 'TdSelectionModel') { //CheckModel,TdSelectionModel,RowSelectionModel
$('tr', $(fun.bDiv)).each(function(index) {
if (grid.isSelect($(this))) {
var index = grid.getRowNo($(this));
indexArr[i] = index;
i++;
}
});
return indexArr;
} else {
$('tr', $(fun.bDiv)).each(function(index) {
if ($(this).hasClass('trSelected')) {
var index = grid.getRowNo($(this));
indexArr[i] = index;
}
});
return indexArr;
}
};
this.getFristSelectRow = function() {
return this.getRow(this.getSelectedRowIndexs()[0]);
};
this.getSelected = function() {
};
this.getTdBySelected = function() {
var val = '';
$('tr', $(fun.bDiv)).each(function(index) {
var tr = $(this);
if (grid.isSelect(tr)) {
$(this).find('td').each(function() {
if ($(this).hasClass('tdSelected')) {
val = grid.data[grid.getRowNo(tr)].getValue($(this).attr('name'));
}
})
}
});
return val;
};
this.getNowPage = function() {
return grid.page;
};
this.hasSelected = function() {
if (this.getSelectedRowIndexs().length == 0) {
return false;
} else {
return true;
}
};
this.setRowHeight = function(rowHeight){
this.rowHeight = rowHeight;
};
this.getEditorsTd = function() {
return this.find("tr td[editor='true']", $(fun.bDiv));
};
this.getAllTdObj = function() {
return this.getAllTrObj().find('td:gt(0)');
};
this.getAllTrObj = function() {
return $('tr', $(fun.bDiv));
};
this.getTbarValue = function(ele) {
return $('#' + ele, $(fun.tbDiv)).val();
};
this.disabled = function(ele) {
typeof ele == 'string' ? $('#' + ele, this).unbind('click').attr("disabled", true).css({
'color':'#F0F0F0'
}) : ele.attr("disabled", true);
};
this.usabled = function(ele) {
typeof ele == 'string' ? fun.buttonEvent(this.toolbarMap.getValue(ele), $('#' + ele, this).css({
'color':'#444444'
}).attr("disabled", false)) : ele.attr("disabled", false);
};
this.reload = function(url, data) {
if (url) {
this.url = url;
this.ajaxdata = data;
fun.bind(url, data, 1, true, this);
} else {
this.ajaxdata = data;
fun.bind(this.url, data, this.page, false, this);
}
};
fun.bodyDiv = document.createElement('div');
fun.mDiv = document.createElement('div');
fun.hDiv = document.createElement('div');
fun.bDiv = document.createElement('div');
fun.tDiv = document.createElement('div');
fun.pDiv = document.createElement('div');
fun.vGrip = document.createElement('div');
fun.pDrag = document.createElement('div');
fun.tbDiv = document.createElement('div');
fun.lDiv = document.createElement('div');
fun.mkDiv = document.createElement('div');
this.initHtml = function() {
var grid = this;
this.width(ps.width).addClass('flexigrid');
fun.createBody(this);
fun.createTitle(this);
fun.createToolbar(this);
fun.createHr(this);
fun.createGbody(this);
if (grid.total) fun.createTotal(this);
fun.createPager(this);
if (ps.hasBotton)fun.createBotton(this);
if (ps.dblUpdate) {
fun.TrsDblclick(this)
}
fun.createLoader(this);
$(".ptogtitle", $(fun.mDiv)).click(function() {
if ($(this).attr('ishide') == 'false') {
$(fun.hDiv,fun.bDiv,fun.tbDiv,fun.vGrip,fun.pDiv,fun.tDiv).hide();
$(this).attr('ishide', 'true');
} else {
$(fun.hDiv,fun.bDiv,fun.tbDiv,fun.vGrip,fun.pDiv,fun.tDiv).show();
$(this).attr('ishide', 'false');
}
})
};
this.init = function () {
this.initHtml();
};
this.init();
return this;
};
})(jQuery);
?
?
??? 先写这么多,下一篇文章中我会对部分代码进行注释说明
1 楼
wangdj
2010-12-21
老大你的JS代码可否放开呢
2 楼
cqhydz
2010-12-23
看了一下,我觉得还不如用extjs,代码量好多啊