AppendGrid是一个jQuery动态表格插件,提供像填写电子表格数据一样在页面去输入结构化数据。 它允许用户在表格里增加/删除/插入/删除行,控制input/select/textarea 提交数据到服务器端应用比如ASP.NET/PHP/JSP,还提供许多回调和操作方法.

效果图如下:

  

  实现步骤有:

  一、引入相关插件:

  主要是红体字这两个。

   <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css" />
<link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-1.18.0.css" />
<link href="css/jquery.appendGrid-development.css" rel="stylesheet" /> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/qunit/qunit-1.18.0.js"></script>
<script type="text/javascript" src="js/jquery.appendGrid-development.js"></script>

  二、初始化表格参数

var gColumns = [
{ name: 'ID', type: 'hidden' },
{ name: 'Album', display: 'Album', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '160px' } },
{ name: 'Artist', display: 'Artist', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '120px' } },
{ name: 'Year', display: 'Year', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '50px' } },
{ name: 'Origin', display: 'Origin', type: 'select', ctrlOptions: { 0: '{Choose}', 1: 'Hong Kong', 2: 'Taiwan', 3: 'Japan', 4: 'Korea', 5: 'US', 6: 'Others' } },
{ name: 'Poster', display: 'With Poster?', type: 'checkbox' },
{ name: 'Price', display: 'Price', type: 'text', ctrlAttr: { maxlength: 10 }, ctrlCss: { width: '60px', 'text-align': 'right' }, value: 0 },
], gData = [
{ 'ID': 1, 'Album': 'Dearest', 'Artist': 'Theresa Fu', 'Year': '2009', 'Origin': 1, 'Poster': true, 'Price': 168.9 },
{ 'ID': 2, 'Album': 'To be Free', 'Artist': 'Arashi', 'Year': '2010', 'Origin': 3, 'Poster': true, 'Price': 152.6 },
{ 'ID': 3, 'Album': 'Count On Me', 'Artist': 'Show Luo', 'Year': '2012', 'Origin': 2, 'Poster': false, 'Price': 306.8 },
{ 'ID': 4, 'Album': 'Wonder Party', 'Artist': 'Wonder Girls', 'Year': '2012', 'Origin': 4, 'Poster': true, 'Price': 108.6 },
{ 'ID': 5, 'Album': 'Reflection', 'Artist': 'Kelly Chen', 'Year': '2013', 'Origin': 1, 'Poster': false, 'Price': 138.2 }

  三、对表格id进行操作

var $grid = $('#tblAppendGrid');  //此为写在JS代码上的。

  四、创建一个调用表格

<body>
<table id="tblAppendGrid"></table>
</body>

  五、完整代码如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>appendGrid Test Basic 01</title> <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css" />
<link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-1.18.0.css" />
<link href="css/jquery.appendGrid-development.css" rel="stylesheet" /> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/qunit/qunit-1.18.0.js"></script>
<script type="text/javascript" src="js/jquery.appendGrid-development.js"></script>
<script type="text/javascript">
// Prepare common variables
var gColumns = [
{ name: 'ID', type: 'hidden' },
{ name: 'Album', display: 'Album', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '160px' } },
{ name: 'Artist', display: 'Artist', type: 'text', ctrlAttr: { maxlength: 100 }, ctrlCss: { width: '120px' } },
{ name: 'Year', display: 'Year', type: 'text', ctrlAttr: { maxlength: 4 }, ctrlCss: { width: '50px' } },
{ name: 'Origin', display: 'Origin', type: 'select', ctrlOptions: { 0: '{Choose}', 1: 'Hong Kong', 2: 'Taiwan', 3: 'Japan', 4: 'Korea', 5: 'US', 6: 'Others' } },
{ name: 'Poster', display: 'With Poster?', type: 'checkbox' },
{ name: 'Price', display: 'Price', type: 'text', ctrlAttr: { maxlength: 10 }, ctrlCss: { width: '60px', 'text-align': 'right' }, value: 0 },
], gData = [
{ 'ID': 1, 'Album': 'Dearest', 'Artist': 'Theresa Fu', 'Year': '2009', 'Origin': 1, 'Poster': true, 'Price': 168.9 },
{ 'ID': 2, 'Album': 'To be Free', 'Artist': 'Arashi', 'Year': '2010', 'Origin': 3, 'Poster': true, 'Price': 152.6 },
{ 'ID': 3, 'Album': 'Count On Me', 'Artist': 'Show Luo', 'Year': '2012', 'Origin': 2, 'Poster': false, 'Price': 306.8 },
{ 'ID': 4, 'Album': 'Wonder Party', 'Artist': 'Wonder Girls', 'Year': '2012', 'Origin': 4, 'Poster': true, 'Price': 108.6 },
{ 'ID': 5, 'Album': 'Reflection', 'Artist': 'Kelly Chen', 'Year': '2013', 'Origin': 1, 'Poster': false, 'Price': 138.2 }
], gI18n = {
append: '!append!',
removeLast: '!removeLast!',
insert: '!insert!',
remove: '!remove!',
moveUp: '!moveUp!',
moveDown: '!moveDown!',
rowDrag: '!rowDrag!',
rowEmpty: '!rowEmpty!'
}, gButtonClasses = {
append: 'ap-pend',
removeLast: 'remove-Last',
insert: 'in-sert',
remove: 're-move',
moveUp: 'move-Up',
moveDown: 'move-Down',
rowDrag: 'row-Drag'
}, gSectionClasses = {
caption: 'cap-tion',
header: 'head-er',
body: 'bo-dy',
footer: 'foot-er'
};
// Start the test
QUnit.test('appendGrid.basic01', function (assert) {
// Declare variables for testing
var eValid = false, eValues, eInitRows = 2, eDataLoaded = false, eCaption = 'My CD Collections', eIdPrefix = 'hello';
// Check isReady
var $grid = $('#tblAppendGrid');
assert.notOk($grid.appendGrid('isReady'), 'Method: isReady=false');
// Create the grid
$grid.appendGrid({
caption: eCaption,
captionTooltip: eCaption,
columns: gColumns,
initRows: eInitRows,
idPrefix: eIdPrefix,
i18n: gI18n,
buttonClasses: gButtonClasses,
sectionClasses: gSectionClasses,
dataLoaded: function () {
eDataLoaded = true;
}
});
assert.ok($grid.appendGrid('isReady'), 'Method: isReady=true');
assert.equal($grid.appendGrid('getRowCount'), eInitRows, 'Option: initRows');
// Check grid layout
assert.equal($('thead td.caption', $grid).text(), eCaption, 'Caption text.');
// Check idPrefix
assert.ok(null != document.getElementById(eIdPrefix + '_rowOrder'), 'Option: idPrefix');
// Load data
assert.notOk($grid.appendGrid('isDataLoaded'), 'Method: isDataLoaded=false');
$grid.appendGrid('load', gData);
assert.ok($grid.appendGrid('isDataLoaded'), 'Method: isDataLoaded=true');
assert.equal($grid.appendGrid('getRowCount'), gData.length, 'Loading data.');
assert.ok(eDataLoaded, 'Load data event.');
// Check i18n
assert.equal($grid.find('tfoot button.append').attr('title'), gI18n.append, 'Option: i18n.append');
assert.equal($grid.find('tfoot button.removeLast').attr('title'), gI18n.removeLast, 'Option: i18n.removeLast');
assert.equal($grid.find('tbody tr td.last button.insert')[0].title, gI18n.insert, 'Option: i18n.insert');
assert.equal($grid.find('tbody tr td.last button.remove')[0].title, gI18n.remove, 'Option: i18n.remove');
assert.equal($grid.find('tbody tr td.last button.moveUp')[0].title, gI18n.moveUp, 'Option: i18n.moveUp');
assert.equal($grid.find('tbody tr td.last button.moveDown')[0].title, gI18n.moveDown, 'Option: i18n.moveDown');
// Check button classes
assert.ok($grid.find('tfoot button.append').hasClass(gButtonClasses.append), 'Option: buttonClasses.append');
assert.ok($grid.find('tfoot button.removeLast').hasClass(gButtonClasses.removeLast), 'Option: buttonClasses.removeLast');
assert.ok($grid.find('tbody tr td.last button.insert').hasClass(gButtonClasses.insert), 'Option: buttonClasses.insert');
assert.ok($grid.find('tbody tr td.last button.remove').hasClass(gButtonClasses.remove), 'Option: buttonClasses.remove');
assert.ok($grid.find('tbody tr td.last button.moveUp').hasClass(gButtonClasses.moveUp), 'Option: buttonClasses.moveUp');
assert.ok($grid.find('tbody tr td.last button.moveDown').hasClass(gButtonClasses.moveDown), 'Option: buttonClasses.moveDown');
// Check section classes
assert.ok($grid.find('thead td.caption').parent().hasClass(gSectionClasses.caption), 'Option: sectionClasses.caption');
assert.ok($grid.find('thead td.first').parent().hasClass(gSectionClasses.header), 'Option: sectionClasses.header');
assert.ok($grid.find('tbody tr:first').hasClass(gSectionClasses.body), 'Option: sectionClasses.body');
assert.ok($grid.find('tfoot tr:first').hasClass(gSectionClasses.footer), 'Option: sectionClasses.footer');
// Check row data
assert.equal($grid.appendGrid('getCtrlValue', 'Artist', 1), gData[1].Artist, 'Method: getCtrlValue 1');
assert.equal($grid.appendGrid('getCtrlValue', 'Origin', 2), gData[2].Origin, 'Method: getCtrlValue 2');
// Check whole row data
eValid = true;
eValues = $grid.appendGrid('getRowValue', 3);
for (var c = 0; c < gColumns.length; c++) {
var colName = gColumns[c].name;
if (eValues[colName] != gData[3][colName]) {
eValid = false;
break;
}
}
assert.ok(eValid, 'Method: getRowValue');
// Insert 1 row before 3th row (index = 2)
$grid.appendGrid('insertRow', 1, 2);
eValues = $grid.appendGrid('getRowOrder');
assert.deepEqual(eValues, [1, 2, 6, 3, 4, 5], 'Method: insertRow');
// Remove 4th row (index = 3)
$grid.appendGrid('removeRow', 3);
eValues = $grid.appendGrid('getRowOrder');
assert.deepEqual(eValues, [1, 2, 6, 4, 5], 'Method: removeRow');
});
</script>
</head>
<body> <table id="tblAppendGrid"></table> </body>
</html>

  

  所需资源详见 github :https://github.com/shenxiaolinZERO/jquery.appendGrid.git

jQuery动态表格插件 AppendGrid的更多相关文章

  1. 001_ jQuery的表格插件dataTable详解

    一. 1.启用id为"datatable1"标签的html的表格jQuery库 $("#datatable1").dataTable( ) Reference: ...

  2. jquery DataTables表格插件的使用(网页数据表格化及分页显示)

    DataTables - 非常强大的 jQuery 表格插件,可变宽页码浏览,现场过滤. 多列排序,自动探测数据类型,智能列宽,可从几乎任何数据源获取数据. 那么在Bootstrap下如何使用Data ...

  3. jQuery dataTable 表格插件的后台分页与界面展示

    效果: html部分: {include file="Public:inner_header" /} <nav class="breadcrumb"> ...

  4. JQuery动态表格

    功能实现:点击添加按钮,表格增加一行并给其name属性赋予的值,方便获取 点击删除,自动删除这一行 JQuery中定义一个count变量 var count = 1; function add() { ...

  5. jQuery Datatable 表格插件

    Datatable 总体来说很好用,可以实现即时搜索和排序.但是只能用于数据量较少的情况下,如果数据量超过1K建议还是用表格加翻页,不然会很慢. datatable 中文网  http://datat ...

  6. jquery动态表格,动态添加表格行

    转载收藏于:https://www.cnblogs.com/zhangqs008/archive/2013/05/09/3618459.html 效果图:   Html:<html> &l ...

  7. 黄聪:jquery.bootgrid表格插件有的属性(visibleInSelection、cssClass、headerCssClass、headerAlign)不能识别的解决办法

    主要是属性大小写问题,修改jquery.bootgrid.js文件,在function loadColumns()方法里面添加下面的语句就好了 data.headerAlign = data.head ...

  8. jquery开发表格插件项目之知识点累积 二

    $.addClass() 增加样式 $.removeClass() 去除样式 $.toggleClass() 单击增加样式,再单击取消样式 $.hasClass() 判断是否存在样式,存在返回true ...

  9. jquery开发表格插件项目之知识点累积

    js设置节点的属性与属性值用setAttribute(),获取节点的属性和属性值用getAttribute(). jquery 中使用attr 就可以获取及设置元素属性. 在设置checkbox状态时 ...

随机推荐

  1. 《Unix内核源码剖析》

    <Unix内核源码剖析> 基本信息 作者: (日)青柳隆宏 译者: 殷中翔 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115345219 上架时间:2014-2 ...

  2. C++中new的用法及显示调用析构函数

    最近被问到了C++内存池的问题,其中不免涉及到在指定内存地址调用对象构造函数以及显示调用对象析构函数的情况. C++中new的用法 new是C++中用于动态内存分配的运算符,在C语言中一般使用mall ...

  3. PreparedStatement 使用like 模糊查询

    PreparedStatement 使用like 在使用PreparedStatement进行模糊查询的时候废了一番周折,以前一直都没有注意这个问题. 一般情况下我们进行精确查询,sql语句类似:se ...

  4. 几个不同版本的framework改进

    一些主要的演变过程及改进,还有很多部分不可能一一列出,下面是从1.1到4.0的一些主要改进: 一..NET Framework 1.1版本 1.ASP.NET移动控件 2.ADO.NET的改动 添加S ...

  5. Cesium随笔(1)部署自己的项目 【转】

    Cesium是国外开发的基于Webgl的跨浏览器的三维地球显示的Javascript开源库,只要浏览器支持Webgl,html5就可以运行.甚至部分手机浏览器都可以运行 . 首先,对Cesium进行本 ...

  6. jquery圆角插件

    为了实现div的圆角效果,你还在用古老的背景图片拼凑的方法吗?还是在用各种浏览器不互相兼容的CSS方式?如果你还在用这样的方式实现圆角,那我告诉你你真的out了,或许是我out了,竟然以前没发现有这样 ...

  7. .NET反射 Type类

    不知道大家有过这样类似的编码 ? 1 Type type=typeof(T);//T是传入的类型 这样写已经是在潜意思的使用反射了.不管你是否知道,但是这是事实. Type是一个抽象类,必须进行实例化 ...

  8. 常见MIME类型

    Response对象通过设置ContentType使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据.  MIME类型格式:类别/子类别;参数 Co ...

  9. (剑指Offer)面试题3:二维数组中的查找

    题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 鉴于数组的规律 ...

  10. html5游戏驴子跳

    在线演示 免费下载 分享一款HTML5开发的游戏,放松一下吧大家吧