实战jquery(1)-自建datagrid,有图有真相有源码

本文介绍了使用jQuery自建datagrid的实战经验,包括组件结构、兼容性挑战及解决方法。通过将内容包裹在div中,利用表格和div实现表头固定效果,并探讨了CSS在不同浏览器的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 css在不同浏览器的兼容性让人头痛。先发图

基本思路如下:

1、datagrid包裹在一个大的div中,里面包括header、title、body、footer几个部门,每个部分都是一个div

2、标题和内容都包含一个具有相同col的table,通过body的scroll函数滚动标题部门的div,使表头和内容看起来是一个整体

3、设置图片背景实现效果,但是css不支持拉伸,要为每个高度实现图片是个讨厌的事情。

构造函数:

	/**
	 * DataGrid Class.
	 * @param setting 表格配置,包括表头标题,列配置等,可以继续扩展
	 * @param id	  表的ID,dom中的ID;
	 * @param owner   表的父容器。
	 * 
	 */
	$.DS.UI.DataGrid = function(setting, id, owner)

构造表的过程如下:

	dataGrid = new $.DS.UI.DataGrid({
		headerTitle:"借阅书籍列表",
		columns:[
			{title:"书籍名称", field:"bookname", width:350},
			{title:"书刊号", field:"bookid", width:250},
			{title:"借阅日期", field:"date", width:200},
			{title:"过期天数", field:"days", width:430},
			{title:"逾期费用", field:"fee", width:430}
			]},"gd_booklist","#booklist");
			
	dataGrid.setJSONData([
		{bookname:"金刚葫芦娃之奥特曼大战孙悟空哪咤打小怪物", bookid:"KJ0001", date:"2011-10-10", days:"5", fee:"0"},
		{bookname:"豆豆龙(1)", bookid:"KJ0002", date:"2011-10-10", days:"5", fee:"0"},
		{bookname:"豆豆龙(2)", bookid:"KJ0002", date:"2011-10-10", days:"5", fee:"0"},
		{bookname:"豆豆龙(3)", bookid:"KJ0002", date:"2011-10-10", days:"5", fee:"0"},
		{bookname:"豆豆龙(4)", bookid:"KJ0002", date:"2011-10-10", days:"5", fee:"0"},
		{bookname:"豆豆龙(5)", bookid:"KJ0002", date:"2011-10-10", days:"5", fee:"0"}
	]);

完整代码和css如下:

js代码:

(function($){
	if( !$.DS ) $.DS = {};
	if( !$.DS.UI ) $.DS.UI = {};
	
	$.DS.UI.defaultDataGridSetting = {
		
	};
	
	$.DS.UI.allDataGrid = {};
	
	/**
	 * DataGrid Class.
	 * @param setting 表格配置,包括表头标题,列配置等,可以继续扩展
	 * @param id	表的ID,dom中的ID;
	 * @param owner   表的父容器。
	 * 
	 */
	$.DS.UI.DataGrid = function(setting, id, owner){
		this.id = id;
		if( !id ) id = "_dg_"+Math.random();
		
		this.setting = $.extend($.DS.UI.defaultDataGridSetting, setting);
		
		this.frame = $("<DIV id=\""+id+"\"></div>");
		this.frame[0]._jobj = this;
		this.frame.addClass("datagrid-frame");
		this.frame.append("<div id=\"_dg_header\">"+setting.headerTitle+"</div>" +
				"<div id=\"_dg_title\"/>" +
				"<div id=\"_dg_body\"/>" +
				"<div id=\"_dg_footer\">footer</div>");
				
		this.header = this.frame.find("#_dg_header");
		this.header.addClass("datagrid-header");
		
		this.title = this.frame.find("#_dg_title");
		this.title.addClass("datagrid-title");
		
		this.body = this.frame.find("#_dg_body");
		this.body.addClass("datagrid-body");
		
		var _title = this.title;
		var _body = this.body;
		
		_frame = this;
		
		this.body.scroll(function(obj){
			_frame.title.offset({left:_frame.content.offset().left});
		});
		
		this.footer = this.frame.find("#_dg_footer");
		this.footer.addClass("datagrid-footer");
		
		this.columns(setting.columns);
		
		this.owner(owner);
	};
	
	$.DS.UI.DataGrid.prototype = {
		/**
		 * @param parent null=getter not null=setter
		 */
		owner:function(owner){
			if( null === owner ) return this._owner;
			if( $(owner) === this._owner ) return this._owner;
			//remove from current parent; 
			if(this._owner) _owner.remove(this.id); 
			this._owner = $(owner);
			this._owner.append(this.frame);
			this.updateDisplay();
		},
		
		columns:function(columns){
			if( null === columns ) return this._columns;
			
			this._columns = columns;
			this.title.empty();
			var title = "";
			var cols = "";
			var testTB = "";
			var columnslength = 0;
			for (var i=0;i<this._columns.length;i++){
				var field = this._columns[i];
				columnslength += field.width;
				//title += "<div style=\"width:"+(field.width)+"\" class=\"datagrid-title-cell\"><p>"+field.title+"</P></div>";
				title += "<td>"+field.title+"</td>";
				cols += "<col width=\""+(field.width)+"\"/>";
				//testTB += "<td>asdfasdf</td>";
			}
			
			this.title.width(columnslength+1000);
			title = "<table style=\"float:left\" width=\""+(columnslength)+"\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">"+cols+"<tr>"+title+"</tr></table>";
			title += "<table style=\"float:left\" width=\"900\"  cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr><td width=\"900\"> </td></tr></table>";
			this.title.html(title);
			
			var tab = "<table width=\""+columnslength+"\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" id=\"_dg_contant\">"+cols+"<tbody/></table>";
			this.body.html(tab);
			this.content = this.body.find("#_dg_contant");
			//this.content.find(">tbody").append("<tr>"+testTB+"</tr>");
		},
		
		loadData:function(url){
			
		},
		
		updateDisplay:function(){
			this.body.width(this.body.parent().width()- 2);
			this.body.height(this.body.parent().height() - this.header.height() 
				- this.title.height() - this.footer.height() );
		},
		
		setJSONData:function(data){
			this.content.find(">tbody").empty();
			var html = "";
			for(var j=0; j < data.length; j++){
				html = "<tr class=\"datagrid-body-row-"+ (j%2) +"\">"
				for (var i=0;i<this._columns.length;i++){
					var field = this._columns[i];
					value = data[j][field.field] || ' ';
					html += "<td>"+value+"</td>";
				}
				html += "</tr>";
				this.content.find(">tbody").append(html);
			}
		},
		
		setDatasource:function(datasource){
			
		}
	}
	
	$.DS.UI.findDataGrid = function(id){
		return $.DS.UI.allDataGrid[id];
	}
})(jQuery)

css部分

@CHARSET "UTF-8";

.datagrid-frame{
	border-bottom: 1px solid #999999;
	border-top: 1px solid #ffffff;
	border-left: 1px solid  #ffffff;
	border-right: 1px solid #999999;
	
	width:99%;
	height:99%;
	text-align: left;
	overflow: hidden
}

.datagrid-header{
	font-size: 20;
	padding:2 2 2 2;
	font-family: 黑体;
	overflow: hidden
}

.datagrid-title-viewport{
	width:100%;
	position: relative;
	list-style: none;
	overflow: hidden
}

.datagrid-title{
	left: 0;
	border-bottom: 1px solid #999999;
	border-top: 1px solid #eeeeee;
	               	
	position: relative;
	overflow:hidden	
}

.datagrid-title td{
	border-bottom: 1px solid #666666;
	border-top: 1px solid #ffffff;
	border-left: 1px solid  #ffffff;
	border-right: 1px solid #666666;
	
	font-size: 28;
	text-align: center;
	font-weight: bold;
	cursor: pointer;
	background-color: #999
}

.datagrid-title-cell{
	position: relative;
	float:left;
	/*padding: 0 5 0 5;*/
	cursor: pointer;
	border-bottom: 1px solid #999999;
	border-top: 1px solid #ffffff;
	border-left: 1px solid  #ffffff;
	border-right: 1px solid #999999;

	background-color: #aaaaaa;
	font-weight: bold;
	font-size: 26;
}

.datagrid-body{
	overflow:auto;
	border-bottom: 1px solid #999999
}

.datagrid-body td{

	border-bottom: 1px solid #666666;
	border-top: 1px solid #ffffff;
	border-left: 1px solid  #ffffff;
	border-right: 1px solid #666666;
  
	font-size: 25;
}

.datagrid-body-row-0{
	background: #111
}

.datagrid-body-row-1{
	background: #223
}

.datagrid-body-cell{
	
}

.datagrid-footer{
	font-size: 30;
	font-family: 黑体
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值