原生js-自定义组件table

使用方法:

// 渲染table

msCtools.tableDom.common({

        columns:columns1 ,

        dataSource:dataSource1,

        width:'100%',

        ischeck:true,

},'tableDOM');

参数说明:

参数

说明

类型

可选值

columns

table表格列内容设置

options

Key、title、align、width

dataSource

table数据

array

——

width

控制表格宽度

String

默认宽800px

ischeck

true/false是否全选

Boolean

默认false

tableid

挂载元素的ID

String

必填

columns与dataSource中的数据相对应,没有对应数据的地方显示为空;

columns表格列内容设置,数组格式:(参数说明如下)

参数

说明

类型

可选值

key

字段名

String

必填

title

表头名

String

必填

align

对齐方式

String

选填

width

列宽度

String

选填

textOver

超出行溢出

Number

选填

ishidden

是否隐藏(true:是,false:否)

Boolean

默认false

render

函数方法

Function

选填

columns中的render函数方法,可对当前数据进行处理后显示,也可设置为数据操作(编辑、查看、删除);

获取勾选数据方法:

msCtools.tableDom.getchecked(tableid);

源码:

var msCtools = {
	conf: {
		host: "",	
		port: "80",
		baseapi: "/api/",
		basepath: "mhc/",
	},
	Table:{
		init:function(param,id){
			var options = {
				columns: [], // 表格列内容设置(key:字段名,title:表头名,align:对齐方式,width:列宽度,textOver:超出行溢出,ishidden:是否隐藏(true:是,false:否)默认false)
				dataSource: [], // 数据
				width: '100%', // 宽度,默认100%
				ischeck:false, // 是否勾选(true:是,false:否),默认false
				style:{
					skin:'', // 边框样式:line线/row行/none无
					even:false, // 是否开启隔行背景(true:是,false:否),默认false
					evenColor:['#fff','#EEF0F2'], // 隔行背景颜色设置
				},
				colClassName:'',
			}
			if (param && {}.toString.call(param) === '[object Object]') {
				for (let attr in param) {
				  options[attr] = param[attr]
				}
			}
			// 参数格式校验:columns必须为数组且key不重复,dataSource必须为数组
			if(!Array.isArray(options.columns)) {
				console.log('错误:传入columns必须为数组');
			} else {
				for(let i = 0; i < options.columns.length; i++) {
					for(let j = i + 1; j < options.columns.length; j++) {
						if(!options.columns[i].key) {
							console.log('key不存在')
							break;
						} else {
							if(options.columns[i].key === options.columns[j].key) {
								console.log('key重复')
								break;
							}
						}
					}
				}
			}
			if(!Array.isArray(options.dataSource)) {
				console.log('错误:传入dataSource必须为数组');
			}
			if(options.style === null || typeof options.style !== "object") {
				console.log('错误:style参数必须为对象');
			}
			if(options === null || typeof options !== "object") {
				console.log('错误:参数必须为对象');
			}
			// 赋值
			this.cols = options.columns;
			this.data = options.dataSource;
			this.width = options.width;
			this.ischeck = options.ischeck;
			this.style = options.style;
			this.colClassName = options.colClassName;
			this.id = id;
			this.content = document.getElementById(id);
			// 创建dom节点
			this.creatDom();
		},
		// 创建节点
		creatDom:function(){
			var table = document.createElement('table');
				table.className = 'table_style';
			// 表格边框的宽度
			table.setAttribute('border','0');
			// 单元格之间的空白
			table.setAttribute('cellspacing','0');
			// 单元边沿与其内容之间的空白
			table.setAttribute('cellpadding','10px');
			
			// table边框样式:line线/row行/none无
			if(this.style.skin == 'line'){
				// 外侧边框的哪个部分是可见的
				table.setAttribute('frame','box');
				// 内侧边框的哪个部分是可见的
				table.setAttribute('rules','all');
			}else if(this.style.skin == 'row'){
				// 外侧边框的哪个部分是可见的
				table.setAttribute('frame','box');
				// 内侧边框的哪个部分是可见的
				table.setAttribute('rules','rows');
			}else if(this.style.skin == 'none'){
				// 无边框
			}
			
			// 设置宽
			table.setAttribute('width',this.width);
			
			var thead = this.creatThead();
			var tbody = this.creatTbody();
			table.appendChild(thead);
			table.appendChild(tbody);
			this.content.appendChild(table);
		},
		// 创建thead
		creatThead:function(){
			var thead = document.createElement('thead');
			var tr = document.createElement('tr');
				tr.className = 'table_cols';
				tr.classList.add(this.colClassName);
			// 是否勾选ischeck( true / false )
			if(this.ischeck){
				var th = document.createElement('th');
					th.id = 'ischeck_th';
					th.className = 'ischeck_inp'
				var input = document.createElement('input');
					input.type = 'checkbox';
					input.setAttribute('style','vertical-align: middle;');
					var content = this.content;
					input.onchange = function(e){
						if(e.target.checked){ 
							// 选中全选
							console.log('触发选中全选');
							msCtools.Table.allCheck(content,true);
						}else{ 
							// 取消全选
							console.log('触发取消全选');
							msCtools.Table.allCheck(content,false);
						}
					}
				var span = document.createElement('span');
					span.id = 'ischeck_title';
					span.innerText = '全选';
				th.appendChild(input);
				th.appendChild(span);
				tr.appendChild(th);
			}
			var lenn = this.cols.length;
			for(var i=0;i<lenn;i++){
				// 非隐藏
				if( !this.cols[i].ishidden){
					var th = document.createElement('th');
						th.innerText = this.cols[i].title;
					tr.appendChild(th);
				}
			}
			thead.appendChild(tr);
			return thead;
		},
		// 创建tbody
		creatTbody:function(){
			var tbody = document.createElement('tbody');
			var lenn = this.data.length;
			for(var i=0;i<lenn;i++){
				var tr = document.createElement('tr');
				// 是否开启隔行背景
				if(this.style.even){
					if(this.style.evenColor){
						if(this.style.evenColor.length > 1){
							var result = i % 2 == 0 ? this.style.evenColor[0] : this.style.evenColor[1];
						}else{
							var result = i % 2 == 0 ? '#ffffff' : '#e4e0e0';
						}
					}else{
						var result = i % 2 == 0 ? '#ffffff' : '#e4e0e0';
					}
					tr.setAttribute('style','background-color:'+result)
				}
				// 是否勾选ischeck
				if(this.ischeck){
					var td = document.createElement('td');
						td.className = 'ischeck_inp'
					var input = document.createElement('input');
						input.type = 'checkbox';
						input.setAttribute('style','vertical-align: middle;');
						input.setAttribute('set-data',this.data[i].id);
						// var set_data1 = JSON.stringify(this.data[i]);
						// input.setAttribute('set-data1',set_data1);
						input.onchange = function(e){
							if(e.target.checked){ 
								// console.log('触发选中')
							}else{ 
								// console.log('触发取消')
							}
						}
					td.appendChild(input);
					tr.appendChild(td);
				}
				var lenn_cols = this.cols.length;
				for(var f=0;f<lenn_cols;f++){
					// 非隐藏
					if( !this.cols[f].ishidden){
						var td = document.createElement('td');
						var span = document.createElement('span');
						if(this.cols[f].render && typeof this.cols[f].render === 'function'){
							// 执行render函数,传入行值和列值,并且获得返回值
							let render = this.cols[f].render(this.data[i][this.cols[f].key], this.data[i]);
							// 如果返回值是一个dom节点,则向td里插入节点
							if(typeof render === "object") {
								td.classList.add('toolBtn')
								td.appendChild(render);
							} else {
								// 否则直接innerHTML
								span.innerHTML = render;
							}
						}else{
							// 直接插入对应值
							span.innerText = this.data[i][this.cols[f].key];
						}
						var td_style = '';
						// 设置对齐方式
						if(this.cols[f].align){
							td_style += 'text-align:'+this.cols[f].align+';';
						}
						// 设置列宽
						if(this.cols[f].width){
							td_style += 'width:'+this.cols[f].width+';';
						}
						// 设置满行溢出
						var textOver = 1;
						if(this.cols[f].textOver){
							textOver = this.cols[f].textOver;
						}
						span.setAttribute('style','overflow : hidden; text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: '+textOver+'; -webkit-box-orient: vertical;')
						td.setAttribute('style',td_style);
						td.appendChild(span);	
						tr.appendChild(td);	
					}
				}
				tbody.appendChild(tr);
			}
			return tbody;
		},
		// 数据操作
		tools:function(arry,data,cb){
			let func = function(){};
			if (cb && {}.toString.call(cb) === '[object Function]') {
				func = cb
			}
			var lenn = arry.length;
			var btns = document.createElement('div');
				btns.classList.add('tooldivBtn');
			for(var i=0;i<lenn;i++){
				// 事件类型:type,文字:text,样式:classname
				let element = document.createElement('a');
				element.innerHTML = arry[i].text;
				element.type = arry[i].type;
				element.className = arry[i].classname;
				var type = arry[i].type;
				element.onclick = function(e){
					// 回调函数:data点击行数据,type点击事件的执行类型:删除、修改....
					func(data,e.target.type)
				}
				btns.appendChild(element)
			}
			return btns;
		},
		// 获取选中数据
		getchecked:function(id){
			var content = document.getElementById(id);
			var table = content.querySelector('table');
			var tbody = table.querySelector('tbody');
			var node_checks = tbody.querySelectorAll('.ischeck_inp');
			var data = [];
			for(var i=0;i<node_checks.length;i++){
				var item = node_checks[i];
				var input = item.querySelector('input[type="checkbox"]');
				if(input.checked){
					// var itm = input.getAttribute('set-data1');
					// 	itm = JSON.parse(itm);
					var itm = input.getAttribute('set-data');
					data.push(itm);
				}
			}
			return data
		},
		// 全选/取消
		allCheck:function(content,ischeck){
			var table = content.querySelector('table');
			var tbody = table.querySelector('tbody');
			var node_checks = tbody.querySelectorAll('.ischeck_inp');
			for(var i=0;i<node_checks.length;i++){
				var item = node_checks[i];
				var input = item.querySelector('input[type="checkbox"]');
					input.checked = ischeck;
			}
		}
	},
}

css样式:

/* table 默认样式 */
.table_style{border-color: #e4e0e0;padding: 0;margin: 0;}
.table_style tbody td{color: #666666;font-size: 14px;}
.table_cols{background-color:#EEF0F2;color: #333;text-align: center;line-height: 40px;}
.table_cols th{padding: 0 15px;font-size: 14px;color: #333;font-weight: normal;}
.ischeck_inp{padding-left: 15px;min-width: 50px;}
.table_style .toolBtn a{padding: 3px 10px;border: 1px solid #999;border-radius: 4px;margin-right: 10px;cursor: pointer;}

使用实例:html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试实例</title>
		<style type="text/css">
			/* table 自定义 */
			.zdy_cols{
				background-color:#01AAED;
				color: #fff;
				text-align: center;
				line-height: 60px;
			}
			.zdy_cols th{padding: 0 25px;font-size: 14px;font-weight: normal;} 
		</style>
		<script src="msCtools.js"></script>
	</head>
	<body>
		<div id="ctools_table"></div>
		<button onclick="getdata()">获取数据</button>
	</body>
	<script>
	var data = [
			{id:'001', name:'还是等会计法恒生科技粉红色快递费数据库',age:12,job:'尽快尽快'},
			{id:'002', name:'lili',age:12,job:'鼎折覆餗老看到集福卡了束带结发SDK福建省看到了附加速度快的说法可接受的开发收到了的看法是打开房间塞德里克肯德基首付款'},
			{id:'003', name:'lili',age:12,job:'尽快尽快'}
	]
	msCtools.Table.init({
		columns:[
			{key: 'id',title: 'id', align: 'center',width:'60px'},
			{key: 'name',title: '姓名', align: 'center',width:'60px'}, 
			{key: 'age',title: '年龄',align: 'center',width:'60px'},
			{key: 'job',title: '工作',align: 'center',
					render:function (text, data){
						return '<span style="color:green;">'+text+'</span>'
					}
			},
			{key: 'tools',title: '操作',align: 'center',width:'200px',
					render:function (text, data){
						return msCtools.Table.tools([{
								type:'del',
								text:'删除',
								classname:' toolBtn delBtn'
							},{
								type:'edit',
								text:'修改',
								classname:'toolBtn editBtn'
							},{
								type:'look',
								text:'查看',
								classname:'toolBtn lookBtn'
							}],data,function(e,type){
								// e:点击行数据
								// type:点击事件执行类型--删除、修改、查看
								if(type == 'del'){
									console.log('删除数据:')
									console.log(e)
								}else if(type == 'edit'){
									console.log('修改数据:')
									console.log(e)
								}else if(type == 'look'){
									console.log('查看数据:')
									console.log(e)
								}
							})
					}
			},
		],
		dataSource:data,
		width:'800px', // 宽度
		ischeck:true, // 是否勾选
        colClassName:'zdy_cols'
	},'ctools_table');
		
	function getdata(){
		var data = msCtools.Table.getchecked('ctools_table');
		console.log(data);
	}
	</script>
</html>

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过给表格中的单元格添加 CSS 样式来自定义列的高度。具体步骤如下: 1. 打开浏览器的开发者工具,找到表格中任意一个单元格的 class 名称,比如 "layui-table-cell"。 2. 根据 class 名称找到对应的 CSS 样式,例如: ```css .layui-table-cell { padding: 15px 20px; height: 50px; /* 默认高度为 50px */ line-height: 30px; } ``` 3. 将样式复制到自己的 CSS 文件中,并修改 height 的值,例如: ```css .my-table-cell { padding: 15px 20px; height: 80px; /* 自定义高度为 80px */ line-height: 30px; } ``` 4. 在表格的 columns 配置中,将自定义的 class 名称添加到对应列的 field 属性中,例如: ```javascript // 定义表格的 columns 配置 var columns = [[ {field: 'id', title: 'ID'}, {field: 'name', title: '姓名', templet: '<div class="my-table-cell">{{d.name}}</div>'}, {field: 'age', title: '年龄'}, {field: 'gender', title: '性别'} ]]; ``` 这样就可以给指定的列添加自定义高度了。注意,由于 CSS 样式是全局生效的,如果多个表格都需要自定义高度的话,需要给不同的表格单元格添加不同的 class 名称,以避免冲突。 ### 回答2: 在layui分页中,columns字段用于定义表格的列,field属性用于指定对应列的字段名。然而,layui并没有提供直接自定义列高度的选项。 不过,我们可以通过一些技巧来实现自定义列高度的效果。比如,在表格的数据渲染之前,我们可以使用JavaScript来动态修改列的高度。 首先,我们可以给每个列添加一个自定义的class,比如"custom-height"。然后,通过jQuery或者原生JavaScript获取到这些列元素,再遍历每个列,设置它们的高度。 代码示例如下: ``` // 给每个列添加自定义的class table.on('renderComplete', function () { $('th', this.elem[0]).addClass('custom-height'); }); // 设置列的高度 $('.custom-height').each(function() { $(this).css('height', '100px'); // 这里使用100px作为示例高度,可以根据需要修改 }); ``` 在上述代码中,我们在渲染完成后,给每个th元素添加了一个名为"custom-height"的class。然后,使用jQuery的each方法遍历所有具有该class的元素,再使用css方法设置它们的高度为100px。 当然,如果你不想使用jQuery,也可以使用原生JavaScript来实现同样的效果。具体的实现方式可能会有所差异,但基本思路是相同的。 需要注意的是,此方法只会影响到表头的高度,并不会影响到表格中的内容。如果需要自定义表格中每一行的高度,可以通过给每个单元格添加class,并设置其高度来实现。 总结起来,虽然layui分页组件没有直接提供自定义列高度的选项,但我们可以通过动态修改列的高度来实现相同的效果。以上是一种可能的实现方式,具体可根据实际需求进行调整。 ### 回答3: 在layui中,分页的columns字段用于定义每一列的数据和样式。但是columns中的field字段不能自定义高度,因为field字段主要用于指定数据源中的字段。 想要自定义列的高度,需要使用layuitable模块的done回调函数来实现。通过修改该回调函数中的DOM元素样式来改变列的高度。 具体步骤如下: 1. 在使用layui的table模块进行表格渲染时,设置done回调函数,该函数在表格渲染完成后触发。 2. 在done回调函数中,使用jQuery或者原生JavaScript来获取每一列的DOM元素。 3. 使用CSS的height属性来设置每一列的高度,可以使用固定值如px,也可以使用百分比来设置。 示例代码如下: ``` layui.use('table', function(){ var table = layui.table; //渲染表格 table.render({ elem: '#id', //需要渲染的表格ID url: '', //数据接口 page: true, //开启分页 cols: [[ {field: 'name', title: '姓名', width: 100}, {field: 'age', title: '年龄', width: 100}, //更多列... ]], done: function(res, curr, count){ //表格渲染完成后的回调函数 var tableCols = document.getElementById('id').getElementsByClassName('layui-table-body')[0].getElementsByTagName('td'); for(var i=0; i<tableCols.length; i++){ tableCols[i].style.height = '50px'; //自定义高度为50px } } }); }); ``` 以上是使用done回调函数来实现自定义列高度的方法。通过获取表格的DOM元素,然后遍历每个列设置样式,实现自定义高度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值