基于Bootstrap使用jQuery实现简单可编辑表格

editTable.js 提供编辑表格当前行、添加一行、删除当前行的操作,其中可以设置参数,如:

operatePos 用于设置放置操作的列,从0开始,-1表示以最后一列作为放置操作的列;(这里的操作包括 编辑当前行、在当前行下添加一行、删除当前行)

handleFirst 设置表格的第一行是否作为操作的对象,true为真,false为假;

edit、save、cancel、add、confirm、del 分别设置显示操作的操作名,默认显示“编辑”、“保存”、“取消”、“添加”、“确认”、“删除”字样;

editableCols 设置可被编辑的列,从0开始,以数组形式进行设置,如 [ 1, 2] ,表示第2、3列进行编辑操作时,可以被编辑;可以传入 "all" ,表示选中所有列可被编辑;当然程序中会自动排除 已经设置要放置操作的列;

order 设置表格需要的操作,同时可以设置操作排放的顺序;参数为数组形式,数组中的值可以为edit、add、del;传入空数组的话,默认提供edit编辑操作,相当于设置 [ "edit" ] 参数;此外默认提供所有功能,即编辑、添加、删除,相当于设置 [ "edit", "add", "del"] 参数,且顺序为编辑-》添加-》删除;可以修改三者的顺序,如 [ "add", "edit", "del" ];

saveCallback 当提供编辑功能后,在编辑当前行的过程中,点击保存后的回调函数;需要用户在使用编辑功能的同时,设置该参数,当进行保存过中,该函数可以使用ajax传递编辑后的数据data(保存在data数组中),当ajax保存数据成功后应该还需要调用函数 参数中的 isSuccess 方法,以修改界面中的可编辑状态为不可编辑状态;

addCallback和delCallback与saveCallback同理,只是分别应用在不同的操作上——添加和删除。

editTable.js

/**
 * Created by DreamBoy on 2016/4/19.
 */
$(function() {
 $.fn.handleTable = function (options) {
 //1.Settings 初始化设置
 var c = $.extend({
  "operatePos" : -1, //-1表示默认操作列为最后一列
  "handleFirst" : false, //第一行是否作为操作的对象
  "edit" : "编辑",
  "save" : "保存",
  "cancel" : "取消",
  "add" : "添加",
  "confirm" : "确认",
  "del" : "删除",
  "editableCols" : "all", //可编辑的列,从0开始
  //"pos" : 0, //位置位于该列开头,还是结尾(左侧或右侧)
  "order" : ["edit", "add", "del"], //指定三个功能的顺序
  "saveCallback" : function(data, isSuccess) { //这里可以写ajax内容,用于保存编辑后的内容
  //data: 返回的数据
  //isSuccess: 方法,用于保存数据成功后,将可编辑状态变为不可编辑状态
  //ajax请求成功(保存数据成功),才回调isSuccess函数(修改保存状态为编辑状态)
  },
  "addCallback" : function(data, isSuccess) {
  //isSuccess: 方法,用于添加数据成功后,将可编辑状态变为不可编辑状态
  },
  "delCallback" : function(isSuccess) {
  //isSuccess: 方法,用于删除数据成功后,将对应行删除
  }
 }, options); 

 //表格的列数
 var colsNum = $(this).find('tr').last().children().size(); 

 //2.初始化操作列,默认为最后一列,从1算起
 if(c.operatePos == -1) {
  c.operatePos = colsNum - 1;
 } 

 //3.获取所有需要被操作的行
 var rows = $(this).find('tr');
 if(!c.handleFirst) {
  rows = rows.not(":eq(0)");
 } 

 //4.获取放置“操作”的列,通过operatePos获取
 var rowsTd = [];
 var allTd = rows.children();
 for(var i = c.operatePos; i <= allTd.size(); i += colsNum) {
  if(c.handleFirst) { //如果操作第一行,就把放置操作的列内容置为空
  allTd.eq(i).html("");
  }
  rowsTd.push(allTd.eq(i)[0]);
 } 

 //6.修改设置 order 为空时的默认值
 if(c.order.length == 0) {
  c.order = ["edit"];
 } 

 //7.保存可编辑的列
 var cols = getEditableCols(); 

 //8.初始化链接的构建
 var saveLink = "", cancelLink = "", editLink = "", addLink = "", confirmLink = "", delLink = "";
 initLink(); 

 //9.初始化操作
 initFunc(c.order, rowsTd); 

 /**
  * 创建操作链接
  */
 function createLink(str) {
  return "<a href=\"javascript:void(0)\" style=\"margin:0 3px\">" + str + "</a>";
 }
 /**
  * 初始各种操作的链接
  */
 function initLink() {
  for(var i = 0; i < c.order.length; i++) {
  switch (c.order[i]) {
   case "edit":
   //“编辑”链接
   editLink = createLink(c.edit);
   saveLink = createLink(c.save);
   cancelLink = createLink(c.cancel);
   break;
   case "add":
   //“添加”链接
   addLink = createLink(c.add);
   //“确认”链接
   confirmLink = createLink(c.confirm);
   //“取消”链接
   cancelLink = createLink(c.cancel);
   break;
   case "del":
   //“删除”链接
   delLink = createLink(c.del);
   break;
  }
  }
 } 

 /**
  * 获取可进行编辑操作的列
  */
 function getEditableCols() {
  var cols = c.editableCols;
  if($.type(c.editableCols) != "array" && cols == "all") { //如果是所有列都可以编辑的话
  cols = [];
  for(var i = 0; i < colsNum; i++) {
   if(i != c.operatePos) { //排除放置操作的列
   cols.push(i);
   }
  }
  } else if($.type(c.editableCols) == "array") { //有指定选择编辑的列的话需要排序放置“编辑”功能的列
  var copyCols = [];
  for(var i = 0; i < cols.length; i++) {
   if(cols[i] != c.operatePos) {
   copyCols.push(cols[i]);
   }
  }
  cols = copyCols;
  }
  return cols;
 } 

 /**
  * 根据c.order参数设置提供的操作
  * @param func 需要设置的操作
  * @param cols 放置操作的列
  */
 function initFunc(func, cols) {
  for(var i = 0; i < func.length; i++) {
  var o = func[i];
  switch(o) {
   case "edit":
   createEdit(cols);
   break;
   case "add":
   createAdd(cols);
   break;
   case "del":
   createDel(cols);
   break;
  }
  }
 } 

 /**
  * 创建“编辑一行”的功能
  * @param operateCol 放置编辑操作的列
  */
 function createEdit(operateCol) {
  $(editLink).appendTo(operateCol).on("click", function() {
  if(replaceQuote($(this).html()) == replaceQuote(c.edit)) { //如果此时是编辑状态
   toSave(this); //将编辑状态变为保存状态
  } else if(replaceQuote($(this).html()) == replaceQuote(c.save)) { //如果此时是保存状态
   var p = $(this).parents('tr'); //获取被点击的当前行
   var data = []; //保存修改后的数据到数据内
   for(var i = 0; i < cols.length; i++) {
   var tr = p.children().eq(cols[i]);
   var inputValue = tr.children('input').val();
   data.push(inputValue);
   } 

   $this = this; //此时的this表示的是 被点击的 编辑链接
   c.saveCallback(data, function() {
   toEdit($this, true);
   });
  }
  });
  var afterSave = []; //保存修改前的信息,用于用户点击取消后的数值返回操作
  //修改为“保存”状态
  function toSave(ele) {
  $(ele).html(c.save); //修改为“保存”
  $(ele).after(cancelLink); //添加相应的取消保存的“取消链接”
  $(ele).next().on('click', function() {
   //if($(this).html() == c.cancel.replace(eval("/\'/gi"),"\"")) {
   toEdit(ele, false);
   //}
  }); 

  //获取被点击编辑的当前行 tr jQuery对象
  var p = $(ele).parents('tr'); 

  afterSave = []; //清空原来保存的数据
  for(var i = 0; i < cols.length; i++) {
   var tr = p.children().eq(cols[i]);
   var editTr = "<input type=\"text\" class=\"form-control\" value=\"" + tr.html() + "\"/>";
   afterSave.push(tr.html()); //保存未修改前的数据
   tr.html(editTr);
  }
  }
  //修改为“编辑”状态(此时,需要通过isSave标志判断是
  // 因为点击了“保存”(保存成功)变为“编辑”状态的,还是因为点击了“取消”变为“编辑”状态的)
  function toEdit(ele, isSave) {
  $(ele).html(c.edit);
  if(replaceQuote($(ele).next().html()) == replaceQuote(c.cancel)) {
   $(ele).next().remove();
  } 

  var p = $(ele).parents('tr'); 

  for(var i = 0; i < cols.length; i++) {
   var tr = p.children().eq(cols[i]);
   var value;
   if(isSave) {
   value = tr.children('input').val();
   } else {
   value = afterSave[i];
   } 

   tr.html(value);
  }
  }
 } 

 /**
  * 创建“添加一行”的功能
  * @param operateCol
  */
 function createAdd(operateCol) {
  $(addLink).appendTo(operateCol).on("click", function() {
  //获取被点击“添加”的当前行 tr jQuery对象
  var p = $(this).parents('tr');
  var copyRow = p.clone(); //构建新的一行
  var input = "<input type=\"text\"/>";
  var childLen = p.children().length;
  for(var i = 0; i < childLen; i++) {
   copyRow.children().eq(i).html("<input type=\"text\" class=\"form-control\"/>");
  } 

  //最后一行是操作行
  var last = copyRow.children().eq(c.operatePos);
  last.html("");
  p.after(copyRow); 

  var confirm = $(confirmLink).appendTo(last).on("click", function() {
   var data = [];
   for(var i = 0; i < childLen; i++) {
   if(i != c.operatePos) {
    var v = copyRow.children().eq(i).children("input").val();
    data.push(v);
    copyRow.children().eq(i).html(v);
   }
   }
   c.addCallback(data, function() {
   last.html("");
   //------------这里可以进行修改
   initFunc(c.order, last);
   });
  }); 

  $(confirm).after(cancelLink); //添加相应的取消保存的“取消链接”
  $(confirm).next().on('click', function() {
   copyRow.remove();
  });
  });
 } 

 /**
  * 创建“删除一行”的功能
  * @param operateCol
  */
 function createDel(operateCol) {
  $(delLink).appendTo(operateCol).on("click", function() {
  var _this = this;
  c.delCallback(function() {
   $(_this).parents('tr').remove();
  });
  });
 } 

 /**
  * 将str中的单引号转为双引号
  * @param str
  */
 function replaceQuote(str) {
  return str.replace(/\'/g, "\"");
 }
 };
}); 

使用过程中需要注意:需要在对应的table中加入可选择到的选择器,还有需要在放置”操作“的列放置空标签<td></td>用于存放”操作“。

使用案例如下:

目录结构:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>表格</title>
 <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css">
 <!--<link href="assets/font-awesome/css/font-awesome.css" rel="stylesheet" />-->
 <!--[if lt IE 9]>
 <script src="js/html5shiv.js"></script>
 <script src="js/respond.min.js"></script>
 <![endif]-->
</head>
<body>
 <div class="container">
 <div class="bs-example" data-example-id="hoverable-table">
  <table class="table table-hover editable">
  <thead>
  <tr>
   <th>#</th>
   <th>Test</th>
   <th>First Name</th>
   <th>Last Name</th>
   <th>Username</th>
   <th>Operations</th>
  </tr>
  </thead>
  <tbody>
  <tr>
   <th scope="row">1</th>
   <td></td>
   <td>Mark</td>
   <td>Otto</td>
   <td>@mdo</td>
   <td><!--<a href="javascript:void(0)" class="edit"></a>--></td>
  </tr>
  <tr>
   <th scope="row">2</th>
   <td></td>
   <td>Jacob</td>
   <td>Thornton</td>
   <td>@fat</td>
   <td><!--<a href="javascript:void(0)" class="edit"></a>--></td>
  </tr>
  <tr>
   <th scope="row">3</th>
   <td></td>
   <td>Larry</td>
   <td>the Bird</td>
   <td>@twitter</td>
   <td><!--<a href="javascript:void(0)" class="edit"></a>--></td>
  </tr>
  </tbody>
  </table>
 </div>
 </div> 

 <script src="js/jquery-1.11.1.min.js"></script>
 <script src="js/bootstrap.min.js"></script>
 <script src="editTable.js"></script>
 <script>
 $(function() {
  //$('.edit').handleTable({"cancel" : "<span class='glyphicon glyphicon-remove'></span>"});
  $('.editable').handleTable({
  "handleFirst" : true,
  "cancel" : " <span class='glyphicon glyphicon-remove'></span> ",
  "edit" : " <span class='glyphicon glyphicon-edit'></span> ",
  "add" : " <span class='glyphicon glyphicon-plus'></span> ",
  "save" : " <span class='glyphicon glyphicon-saved'></span> ",
  "confirm" : " <span class='glyphicon glyphicon-ok'></span> ",
  "operatePos" : -1,
  "editableCols" : [2,3,4],
  "order": ["add","edit"],
  "saveCallback" : function(data, isSuccess) { //这里可以写ajax内容,用于保存编辑后的内容
   //data: 返回的数据
   //isSucess: 方法,用于保存数据成功后,将可编辑状态变为不可编辑状态
   var flag = true; //ajax请求成功(保存数据成功),才回调isSuccess函数(修改保存状态为编辑状态)
   if(flag) {
   isSuccess();
   alert(data + " 保存成功");
   } else {
   alert(data + " 保存失败");
   } 

   return true;
  },
  "addCallback" : function(data,isSuccess) {
   var flag = true;
   if(flag) {
   isSuccess();
   alert(data + " 增加成功");
   } else {
   alert(data + " 增加失败");
   }
  },
  "delCallback" : function(isSuccess) {
   var flag = true;
   if(flag) {
   isSuccess();
   alert("删除成功");
   } else {
   alert("删除失败");
   }
  }
  });
 });
 </script>
</body>
</html> 

运行结果如下

使用编辑操作:

进行修改:

点击保存:

添加多行:

在其中添加一些数据:

点击“确定”:

可以取消其他多余要添加的行:

如果大家还想深入学习,可以点击这里进行学习,再为大家附3个精彩的专题:

Bootstrap学习教程

Bootstrap实战教程

Bootstrap插件使用教程

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • jQuery+PHP实现可编辑表格字段内容并实时保存

    本例适用场景:当查看详细资料,如用户详情信息,发现其中某几个字段信息需要修改,可直接点击该字段内容进行修改,节约了用户时间,(传统的做法是进入一个编辑页面,列出所有编辑的字段信息,即使你只需要编辑其中一两个字段内容,然后点击提交)提高了WEB响应速度,从而提高了前端用户体验. 本例依赖jquery库,并基于插件,具有以下特点: 实时编辑,后台实时响应,并即时完成局部刷新. 可自定义输入表单类型,目前jeditable提供text,select,textarea类型. 响应键盘的回车和ESC键.

  • jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera

    要实现可编辑的表格功能,我们要解决以下问题: 1.明确要修改的数据在表格中是哪些列(如何找到这些单元格); 2.如何让单元格变成可以编辑的; 3.如何处理单元格的一些按键事件; 4.解决跨浏览器问题. 我们通过jQuery可以一步一步解决上述问题. 一. 绘制表格 首先我们先画好一个表格. Code1: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww

  • BootStrap和jQuery相结合实现可编辑表格

    editTable.js 提供编辑表格当前行.添加一行.删除当前行的操作,其中可以设置参数,如: operatePos 用于设置放置操作的列,从0开始,-1表示以最后一列作为放置操作的列:(这里的操作包括 编辑当前行.在当前行下添加一行.删除当前行) handleFirst 设置表格的第一行是否作为操作的对象,true为真,false为假: edit.save.cancel.add.confirm.del 分别设置显示操作的操作名,默认显示"编辑"."保存".&qu

  • jQuery(非HTML5)可编辑表格实现代码

    功能: 单击单元格选中,选中过程中使用方向键更换选中的单元格,选中过程中按回车键或者直接双击单元格进入可编辑状态,单元格失去焦点时保存修改的内容. 主要实现思路: 选中,移动选中区域等都是依靠jQuery强大的API进行实现的.而可编辑的单元格实际上是在选中单元格时,在单元格上面添加个input输入域,动态的更新数据 源代码: HTML代码: 复制代码 代码如下: <table class="editableTable"> <thead> <tr>

  • jQuery 实现双击编辑表格功能

    先给大家展示下效果图: 下面用简单方法实现的简单表格编辑功能: 简单的HTML代码略过了,下面是js实现过程 JavaScript: <span style="font-size:18px;">$(".tables").on("dblclick","td",function(){ if($(this).children("input").length>0){ return false; }

  • 用Jquery实现可编辑表格并用AJAX提交到服务器修改数据

    下面是js Code: 复制代码 代码如下: $(function() { // 相当于在页面中的body标签加上onload事件 $(".caname").click(function() { // 给页面中有caname类的标签加上click函数 var objTD = $(this); var oldText = $.trim(objTD.text()); // 保存老的类别名称 var input = $("<input type='text' value='&

  • 基于Bootstrap使用jQuery实现简单可编辑表格

    editTable.js 提供编辑表格当前行.添加一行.删除当前行的操作,其中可以设置参数,如: operatePos 用于设置放置操作的列,从0开始,-1表示以最后一列作为放置操作的列:(这里的操作包括 编辑当前行.在当前行下添加一行.删除当前行) handleFirst 设置表格的第一行是否作为操作的对象,true为真,false为假: edit.save.cancel.add.confirm.del 分别设置显示操作的操作名,默认显示"编辑"."保存".&qu

  • 封装的dialog插件 基于bootstrap模态对话框的简单扩展

    在使用bootstrap 模态对话框时需要在页面写对话框html,如果一个页面有许多地方需要对话框,那意味着需要写多个,感觉很麻烦,平时不太习惯bootstrap 模态对话框这种方式,所以做了个简单封装及扩展,增加了自定义标题,宽度和高度,并根据宽高居中显示. 默认属性: id:"modal",//弹窗id title:"dialog",//弹窗标题 width:"600",//弹窗宽度,暂时不支持% height:"500"

  • 基于BootStrap与jQuery.validate实现表单提交校验功能

    谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.User是我们面对较多的对象,也是较核心的对象.最开始的用户注册和登陆这块,也就尤为重要. 直接看demo:http://www.suchso.com/code/bootstrapvalidate/ 用户注册和登录其实往往比我们想象的难.就比如表单校验,里面涵盖的内容其实挺多,就前台而言,你需要了解: 1.正则表达式的基本了解 其实正则并不难,并且在学会后能带给你极

  • 基于Bootstrap和jQuery构建前端分页工具实例代码

    前言 为啥名字叫[前端分页工具]?因为我实在想不到什么好名字,如果想要更加贴切的理解这个工具,应该从业务来看 业务是这样的,有一个数据从后台传到前台,因为数据量不大,因此传过来之后直接显示即可,但是=.=所谓的数据量不大,最多也达到成百上千条,不可能全部显示出来,那么就需要分页 常规的分页是利用Ajax,通过传页偏移量到后台,后台查询数据库再返回数据,可以实现无刷新分页,拿到的数据也是最新的 前端分页 优点:一次传输数据,避免用户反复请求服务器,减少网络带宽.服务器调度压力.数据库查询.缓存查询

  • 基于Bootstrap 3 JQuery及RegExp的表单验证功能

    昨天小编在研究regexp,今天小编抽空给大家分享表单验证. 主要功能: 用户名必须在5-25个字符之内,而且只能使用字母.数字或下划线,否则不让通过. 密码必须在5-25个字符之内,而且只能使用字母或数字(大小写敏感),否则不让通过. 根据不同密码程度,下面的low.medium和high会改变背景颜色. 确认密码就不说啦. 验证码只是做了个样子,反正就是设成必须是5个数字. checkbox必须打勾啦,不然不让通过. 点击注册按钮,会有相应的提示框(可关闭)弹出. HTML: <body>

  • 基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码

    1.   测试环境 JQuery-3.2.1.min.j Bootstrap-3.3.7-dist win7 1.2.   实践 HTML代码片段 <div class="container-fluid"> <div class="row"> <!--添加左侧菜单栏 --> <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"> <div class

  • jQuery实现的可编辑表格完整实例

    本文实例讲述了jQuery实现的可编辑表格.分享给大家供大家参考,具体如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; cha

  • 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除

    本文实例为大家分享使用jQuery实现输入框组input-group的添加与删除操作,供大家参考,具体内容如下 注意这里要求使用到Bootstrap框架的输入框组,如: <div class="row"> <div class="col-lg-6"> <div class="input-group"> <span class="input-group-addon"> <in

随机推荐