您的位置:首页 > Web前端 > JQuery

【jquery模仿net控件】初步GridView模型实现,及其简单应用

2012-05-17 23:30 543 查看
最近日子不好过,主要原因是要毕业了,学校那边的毕业论文让人很头痛,就跟写八股文似的,个人非常头疼并且厌恨这种

对我无意义的东西,哎!!!体制啊,既然无法改变,何不将之做好呢!!!对,于是我还是不想写论文,拖着吧,到哪天确实

拖不下去了再说;加之公司项目也非常紧,又要写论文,虽说没写,心里就是一个不舒服啊!!!所以平时抽了点时间模拟了下

gridview,个人是菜鸟自不必多说,但是这几个月来,模拟写着写着感觉学到了不少东西哟!!!

算了....扯远了,进入正文。

前期工作

之前主要模拟了一次datalist,基本上以它为基础将igoogle功能完全实现,并且应用到项目中去了,控件不好,但也不是完全没有意义,

过程中需要类似gridview的功能,索性也就写了一下,思路与datalist差距不大。

因为马上要写论文了,而且是不完全版本这里就不画图什么的了,以后发完整版本再说吧:

效果图









简单说明

该简单应用也是我第一次做测试,有一下几个事件:

① 鼠标滑动时变色事件

② 点击大类选取小类事件

③ 点击获取时候全部获取事件

④ 当然,不能忘了行绑定事件,初期只是绑定了大类,小类根据大类id作出的加载

核心代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="../js/jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/../scripts/jquery-1.7.1.js" type="text/javascript"></script>
<script src="../js/GridViewBase.js" type="text/javascript"></script>
<script src="../js/GridColum.js" type="text/javascript"></script>
<script src="../js/GridRow.js" type="text/javascript"></script>
<script src="../js/GridView.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/../scripts/jquery.cookie.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
var url = '../Ajax.aspx?sql=select * from bigType  ';
$.getJSON(url, function (data) {
var g = new GridView();

$("#www").click(function () {
var rows = g.rows;
var str = "";
$.each(rows, function (i, row) {
var checks = row.getEl("input:checkbox");
checks.each(function (ii, jj) {
if ($(this).attr("checked")) {
str += $(this).val() + "  ,  "
}
});

});
alert(str);
});

g.style.width = "500px";
g.colModel = [{
'th': { 'title': '大类' },
'td': { 'template': '{%title%}<input  value="{%id%}" type="checkbox" class="bigId"  />', 'attribute': {}, 'style': {} }
}, {
'th': { 'title': '小类' },
'td': { 'template': '<div class="type"></div>', 'attribute': {}, 'style': {} }
}
];
g.trEvent = [
{
eventType: 'ready',
func: function (param, e) {
var scope = this;
var tr = scope.el;
var back = tr.css('background-color');
tr.unbind('mousemove');
tr.bind('mousemove', function () {
tr.css('background-color', '#efefef');
});
tr.unbind('mouseout');
tr.bind('mouseout', function () {
tr.css('background-color', back);
});

}
},
{
eventType: 'ready',
func: function (param, e) {
var scope = this;
var type = scope.getEl(".type");
var id = param.id;
var _url = "../Ajax.aspx?sql=select * from smallType where bigTypeId='" + id + "'  "
$.getJSON(_url, function (data) {
$.each(data, function (i, item) {
var html = '  ' + item.title + '<input  value="' + item.id + '" type="checkbox" class="sId" disabled="disabled" />';
type.append(html);
});

var bigId = scope.getEl(".bigId");
bigId.unbind("change");
bigId.bind("change", function () {
var smallTyle = scope.getEl(".sId");
if (bigId.attr('checked') == 'checked') {
smallTyle.attr("checked", "checked");
smallTyle.removeAttr('disabled');
} else {
smallTyle.removeAttr('checked');
smallTyle.attr('disabled', 'disabled');
}

});
});
}
}
];
g.dataSource = data;
g.render();

});

});

</script>
</head>
<body>
<input type="button" value="获取" id="www" />
</body>
</html>


/// <reference path='jquery-1.7.1.min.js' />
/// <reference path='GridViewBase.js' />
/// <reference path='GridColum.js' />
/// <reference path='GridRow.js' />

/*
控件生成流程:
1 先初始化表格每列的【列头】以及【body信息】,最好可指定列id,用于后期检索
2 赋予控件二维数据(但控件字段最好可支持多维数据获取)
3 初始化外围table,并赋予其属性样式,最外层结束
4 根据二维数据依次初始化每行数据,【其实可在此处初始化表头,因为若是没有数据表头将不初始化】
5 每行获得其数据源,先形成tr,然后将数据源直接赋予单元行进行初始化
6 单元化格式化单元模板,生成html标签

*/

var GridView = function (id) {
var scope = this;
this.style = {};
this.attribute = {
id: id && id.length > 0 ? id : new Date().getTime().toString(),
className: 'wl'
};
this.id = this.attribute.id;
this.thId = this.id + '_header';
this.dataSource = [];
this.header = null;
this.rows = [];
this.el = null;
this.parentData = null;

this.thEvent = [
{
func: function (rows, e) {
var scope = this;
var select = scope.getThEl('.th_select');
select.unbind('click');
select.bind('click', function (e) {
var th_s = select.attr('checked');
$.each(rows, function (i, row) {
var td_select = row.getEl('.td_select');
//                     var td_s = td_select.attr('checked');
if (th_s && th_s == 'checked') {
td_select.attr('checked', 'checked');
} else {
td_select.removeAttr('checked');
}

});
});
}
}
];
this.trEvent = [
{
eventType: 'ready',
func: function (param, e) {
var scope = this;
var tr = scope.el;
var back = tr.css('background-color');
tr.unbind('mousemove');
tr.bind('mousemove', function () {
tr.css('background-color', '#efefef');
});
tr.unbind('mouseout');
tr.bind('mouseout', function () {
tr.css('background-color', back);
});

}
},
{
eventType: 'ready',
func: function (param, e) {
var scope = this;
var edit = scope.getEl('.td_edit');
edit.unbind('click');
edit.bind('click', function (ee) {
var div = scope.getEl('div');
div.hide();

});
}
}
];
this.tdEvent = [
{
//         eventType: 'click',
//         func: function (param, e) {
//             var scope = this;
//             var td = scope.el;
//             var input = $('<input style="width:100%;height:100%;" value="' + td.text() + '" />');
//             td.html(input);
//         }
}
];

this.preInit = new EventHandler();
this.initComplete = new EventHandler();
this.preLoad = new EventHandler();
this.loadComplete = new EventHandler();

this.parentEl = $('body');
this.colModel = [{
'th': { 'title': '<input  value="" type="checkbox" class="th_select" />', 'attribute': {}, 'style': {} },
'td': { 'type': '', 'value': '', 'template': '<input  value="{%title%}" type="checkbox"class="td_select"  />', 'attribute': {}, 'style': {} }
}, {
'th': { 'title': '111', 'attribute': {}, 'style': {} },
'td': { 'type': '', 'value': '', 'template': '<input style="display:none;" value="{%title%}" /><div class="td_title">{%title%}</div>', 'attribute': { className: 'wlR' }, 'style': { 'color': 'Blue'} }
}, {
'th': { 'title': '222', 'attribute': {}, 'style': {} },
'td': { 'type': '', 'value': '', 'template': '<textarea style="display:none;" >{%summary%}</textarea><div class="td_summary">{%summary%}</div>', 'attribute': {}, 'style': {} }
}, {
'th': { 'title': '编辑', 'attribute': {}, 'style': {} },
'td': { 'type': '', 'value': '', 'template': '<input type="button" value="编辑" class="td_edit" />', 'attribute': {}, 'style': {} }
}
];

};
GridView.prototype.render = function () {
var scope = this;
scope.onInit();
scope.onLoad();
scope.eventBind();

};

GridView.prototype.onInit = function () {
var scope = this;
scope.preInit.invoke();
scope.initHtml();
scope.initAttr();
scope.initStyle();
scope.initComplete.invoke();

};
GridView.prototype.initHtml = function () {
var scope = this;
var el = $('<table></table>');
scope.el = el;
var parentEl = scope.parentEl;
parentEl.append(el);
scope.initHeader();
};
GridView.prototype.initHeader = function () {
var scope = this;
var header = $('<tr></tr>');
header.attr('id', scope.thId);
var model = scope.colModel;
$.each(model, function (i, col) {
var th = col['th'];
if (th) {
var val = th['title'];
var td = $('<th>' + val + '</th>');
header.append(td);
}
});
scope.header = header;
var table = scope.el;
table.append(header);
};
GridView.prototype.initAttr = function () {
utils.initAttr(this);
};
GridView.prototype.initStyle = function () {
utils.initStyle(this);
};

GridView.prototype.onLoad = function () {
var scope = this;
scope.preLoad.invoke();
scope.loadHtml();
scope.loadRows();
scope.loadComplete.invoke();
};
GridView.prototype.loadHtml = function () {
utils.loadhtml(this);
};
GridView.prototype.loadRows = function () {
var scope = this;
var dataSource = scope.dataSource;
$.each(dataSource, function (index, item) {
var gridRow = new GridRow();
gridRow.parentObj = scope;
gridRow.dataSource = item;
gridRow.rowIndex = index;
gridRow.event = scope.trEvent;
gridRow.tdEvent = scope.tdEvent;

gridRow.colModel = scope.colModel;

gridRow.render();
scope.rows.push(gridRow);
});

};
GridView.prototype.eventBind = function () {
var scope = this;
scope.headerEventBind();
};

GridView.prototype.headerEventBind = function () {
var scope = this;
var el = scope.el;
var thEvent = scope.thEvent;
$.each(thEvent, function (i, item) {
var func = item.func;
el.ready(function (e) {
func.call(scope, scope.rows, e);
});

});
};

GridView.prototype.getThEl = function (elementKey) {
var scope = this;
var thId = scope.thId;
var id = "#" + thId + " " + elementKey;
var element = $(id);
return element;
};


// <reference path="jquery-1.7.1.min.js" />
/// <reference path="GridViewBase.js" />
/// <reference path="GridColum.js" />

var GridRow = function () {
var scope = this;
this.parentObj = null;

this.el = null;
this.style = {};
this.attribute = {};
this.dataSource = [];
this.columns = [];
this.rowIndex;
this.colModel = null;

this.id = "";
this.event = [];
this.preInit = new EventHandler();
this.initComplete = new EventHandler();
this.preLoad = new EventHandler();
this.loadComplete = new EventHandler();

};
GridRow.prototype.render = function () {
var scope = this;
scope.onInit();
scope.onLoad();
scope.eventBind();
};

GridRow.prototype.onInit = function () {
var scope = this;
scope.parentEl = scope.parentObj.el;
scope.parentId = scope.parentObj.id;

scope.preInit.invoke();
scope.initHtml();
scope.initAttr();
scope.initStyle();
scope.initComplete.invoke();

};
GridRow.prototype.initHtml = function () {
var scope = this;
var el = $('<tr></tr>');
scope.el = el;
var parentEl = scope.parentEl;
parentEl.append(el);
};
GridRow.prototype.initAttr = function () {
var scope = this;
utils.initAttr(this);
var el = scope.el;
var parentId = scope.parentId;
var rowIndex = scope.rowIndex;
var id = parentId + "_row_" + rowIndex;
scope.id = id;
scope.attribute.id = id;
el.attr("id", id);
};
GridRow.prototype.initStyle = function () {
utils.initStyle(this);
};

GridRow.prototype.onLoad = function () {
var scope = this;
scope.preLoad.invoke();
scope.loadHtml();
scope.loadCols();
scope.loadComplete.invoke();
};
GridRow.prototype.loadHtml = function () {
utils.loadhtml(this);
};

GridRow.prototype.loadCols = function () {
var scope = this;
var dataSource = scope.dataSource;
var colModel = scope.colModel;
utils.formatColTemplate(this);

$.each(colModel, function (i, model) {
var td = model.td;
var gridColumn = new GridColumn();
gridColumn.parentObj = scope;
gridColumn.dataSource = dataSource;
gridColumn.colIndex = i;
gridColumn.model = model;
gridColumn.attribute = td.attribute;
gridColumn.style = td.style;
gridColumn.event = scope.tdEvent;
gridColumn.render();
scope.columns.push(gridColumn);
});

};

GridRow.prototype.eventBind = function () {
utils.eventBind(this, this.dataSource);
};

GridRow.prototype.getEl = function (elementKey) {
var scope = this;
var id = scope.id;
var id = "#" + id + " " + elementKey;
var element = $(id);
return element;
};


/// <reference path="jquery-1.7.1.min.js" />
/// <reference path="GridViewBase.js" />

var GridColumn = function (cfg) {
var scope = this;
this.parentObj = null;
this.el = null;
this.style = {};
this.attribute = {};
this.type = 'field'; //暂时提供filed数据字段、template模板两种
this.model = {};
this.colIndex;
this.dataSource = null;
this.event = [];
this.preInit = new EventHandler();
this.initComplete = new EventHandler();
this.preLoad = new EventHandler();
this.loadComplete = new EventHandler();

};
GridColumn.prototype.render = function () {
var scope = this;
scope.onInit();
scope.onLoad();
scope.eventBind();
};

GridColumn.prototype.onInit = function () {
var scope = this;
scope.parentEl = scope.parentObj.el;
scope.parentId = scope.parentObj.attribute.id;
scope.preInit.invoke();
scope.initHtml();
scope.initAttr();
scope.initStyle();
scope.initComplete.invoke();

};

GridColumn.prototype.initBody = function (td, dataSource) {
var scope = this;
var parentEl = scope.parentEl;
var templateObj = td['templateObj'];
var tempHtm = "";
$.each(templateObj, function (i, item) {
if (item.field) {
tempHtm = tempHtm + item.html + dataSource[item.field];
} else {
tempHtm = tempHtm + item.html;
}
});
var newHtm = tempHtm;
var reg = /\[%(.*?)%\]/;
var para = reg.exec(newHtm);
while (para && para.length > 0) {
var len = para.index;
var comStr = para[0].substr(2, para[0].length - 4);
var s1 = newHtm.substr(0, len);
var s2 = newHtm.substr(len + para[0].length);
newHtm = s1 + eval(comStr) + s2;
para = reg.exec(newHtm);
}
tempHtm = newHtm;
var td = $('<td>' + tempHtm + '</td>');
scope.el = td;
parentEl.append(td);

};
GridColumn.prototype.initHtml = function () {
var scope = this;
var dataSource = scope.dataSource;
var col = scope.model;

var td = col['td'];
scope.initBody(td, dataSource);

};

GridColumn.prototype.initAttr = function () {
var scope = this;
var el = scope.el;
var parentId = scope.parentId;
var id = parentId + "_"+scope.colIndex;
scope.id = id;
scope.attribute.id = id;
utils.initAttr(this);
el.attr("id", id);

};

GridColumn.prototype.initStyle = function () {
utils.initStyle(this);
};

GridColumn.prototype.onLoad = function () {
var scope = this;
scope.preLoad.invoke();
scope.loadHtml();
scope.loadComplete.invoke();
};
GridColumn.prototype.loadHtml = function () {

};
GridColumn.prototype.eventBind = function () {
utils.eventBind(this, this.dataSource);
};


/// <reference path="jquery-1.7.1.min.js" />

var Delegate = function (func, sender, param) {
this.target = sender;
this.method = func;
this.invoke = function () {
if (func && typeof (func) == "function") {
func.call(sender, param);
};
};
};

var EventHandler = function () {
this.delegate = [];
this.add = function (func, sender, param) {
var delegate = new Delegate(func, sender, param);
this.delegate.push(delegate);
};
this.remove = function (func) {
for (var i = 0, len = this.delegate.length; i < len; i++) {
if (this.delegate[i][func] == func) {
this.delegate[func] = null;
}
}
};
this.invoke = function () {
for (var i = 0, len = this.delegate.length; i < len; i++) {
this.delegate[i].invoke();
}
};
};

var GridViewUtils = function () { };
GridViewUtils.prototype.initStyle = function (sender) {
var scope = sender;
var el = scope.el;
$.each(scope.style, function (key, value) {
if (typeof (key) == 'string' && key.length > 0) {
el.css(key, value);
}
});
};
GridViewUtils.prototype.initAttr = function (sender) {
var scope = sender;
var el = scope.el;
$.each(scope.attribute, function (key, value) {
if (typeof (key) == 'string' && key.length > 0) {
if (key == 'className')
key = 'class';
el.attr(key, value);
}
});
};
GridViewUtils.prototype.eventBind = function (sender,param) {
var scope = sender;
var el = scope.el;
$.each(scope.event, function (i, item) {
var func = item.func;
var eventType = item.eventType;
if (eventType == "ready") {
el.ready(function (e) {
func.call(scope, param, e);
});
} else {
el.unbind(eventType);
el.bind(eventType, function (e) {
func.call(scope, param, e);
});
}

});
};
GridViewUtils.prototype.loadhtml = function (sender) {
//    var scope = sender;
//    var parentEl = scope.parentEl;
//    var el = scope.el;
//    parentEl.append(el);
};
GridViewUtils.prototype.formatColTemplate = function (sender) {
var scope = sender;
var model = scope.colModel;
var reg = /\{%[\w]*\%}/;
$.each(model, function (i, v) {
model[i]['td']['templateObj'] = [];
var template = v['td']['template'];
var para = reg.exec(template);
var tempHtml = template;
while (para && para.length > 0) {
var len = para.index;
var temp = {};
temp.html = tempHtml.substr(0, len);
temp.field = para[0].substr(2, para[0].length - 4);
model[i]['td']['templateObj'].push(temp);
tempHtml = tempHtml.substr(len + para[0].length);
para = reg.exec(tempHtml);
}
var end = {};
end.html = tempHtml;
model[i]['td']['templateObj'].push(end);
var sss = "";
});
};
var utils = new GridViewUtils();


后续

做的过程中,想模拟.net控件的生命周期,并且实现委托那种高级东西,只不过自己学的太浅了,有点不够力啊。

详细请看下个版本吧,此版本欢迎拍砖
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐