zoukankan      html  css  js  c++  java
  • 基于Datatables实现表格行内编辑功能

    Datatables没有行内编辑功能的直接实现方式,一般通过弹出框的形式去更新表格内容,在某些简单的表格情况下,直接行内编辑可优化流程。尝试通过操作DOM来实现。

    重点是columnDefs。

    官网上的说明是

     columnsOption 参数很像,这个参数允许你给指定列设置选项,应用到一个或这多个列。而不像 columnsOption 需要每列都要定义

    这个参数是一个列定义对象数组,通过使用 columnDefs.targets 选项,告诉Datatables是定义的是那一列,他可以是下列情况:

    • 0或者正整数-列从左到右是从0开始
    • 一个负数-列从右到左的索引(-1代表最后一列)
    • 一个字符串-将字符串和类名匹配列
    • 字符串"_all"-所有列

    另外, targets可以同时指定多列,接受一个数组(比如 targets: [ -1, -2 ] )。

    核心代码解析:

    index.html

     

    <!DOCTYPE html>
    <html lang="en">

     

    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet">
    <link href="datatables/css/dataTables.bootstrap.min.css" rel="stylesheet">
    <style>
    body,
    html {
    margin: 0;
    padding: 0;
    }

     

    .gridArea {
    padding: 10px;
    }
    </style>
    </head>

     

    <body>
    <div class="gridArea">
    <table id="myGrid" class="nowrap table table-striped table-bordered table-hover table-condensed" cellspacing="0"
    width="100%">
    <thead>
    <tr>
    <th>显示名称</th>
    <th>属性名称</th>
    <th>可为空</th>
    <th>关联关系</th>
    <th>属性类型</th>
    </tr>
    </thead>

     

    </table>
    </div>

     


    <script src="jquery/jquery-1.12.3.min.js"></script>
    <script src="datatables/js/jquery.dataTables.min.js"></script>
    <script src="datatables/js/dataTables.bootstrap.min.js"></script>
    <script src="index.js"></script>
    </body>

     

    </html>

    index.js

    function createCombox(data) {
    var _html = '<select style="100%;">';
    data.forEach(function (ele, index) {
    _html += '<option>' + ele + '</option>';
    });
    _html += '</select>';
    return _html;
    }

    $(function () {
    var editTableObj;
    var comboData = {
    "2": ["是", "否"],
    "3": ["ManyToOne", "OneToMany", "无"],
    "4": ["String", "Long", "Integer", "Boolean", "Date", "当前实体"]
    };
    var setting = {
    columns: [
    { "data": "display" },
    { "data": "name" },
    { "data": "nullable" },
    { "data": "relation" },
    { "data": "type" }
    ],
    columnDefs: [{
    "targets": [0, 1],
    createdCell: function (cell, cellData, rowData, rowIndex, colIndex) {
    $(cell).click(function () {
    $(this).html('<input type="text" size="16" style=" 100%"/>');
    var aInput = $(this).find(":input");
    aInput.focus().val(cellData);
    });
    $(cell).on("blur", ":input", function () {
    var text = $(this).val();
    $(cell).html(text);
    editTableObj.cell(cell).data(text)
    })
    }
    }, {
    "targets": [2, 3, 4],
    createdCell: function (cell, cellData, rowData, rowIndex, colIndex) {
    var aInput;
    $(cell).click(function () {
    $(this).html(createCombox(comboData[colIndex]));
    var aInput = $(this).find(":input");
    aInput.focus().val("");
    });
    $(cell).on("click", ":input", function (e) {
    e.stopPropagation();
    });
    $(cell).on("change", ":input", function () {
    $(this).blur();
    });
    $(cell).on("blur", ":input", function () {
    var text = $(this).find("option:selected").text();
    editTableObj.cell(cell).data(text)
    });
    }
    }],
    data: [{
    "display": "1",
    "name": "",
    "nullable": null,
    "relation": null,
    "type": null,
    }],
    ordering: false,
    paging: false,
    info: false,
    searching: false,
    };
    editTableObj = $("#myGrid").DataTable(setting);
    });

    -------------------------------

    其中,

    createdCell可以操作指定的DOM,它的五个参数分别是:td节点,单元格里的数据,正行的数据对象,单元格的行索引,单元格的列索引。

    因为序号列和单选占据了01所以从2开始,target23的编辑形式是texttarget4/5/6的编辑形式是select,其他的编辑形式也可以。

    text形式的是点击单元格的时候出现文本框并且手动让其得焦,失去焦点的时候改变单元格的数据,这个很容易理解,唯一要注意的是,改变单元格数据的时候不能直接操作dom,那样的话只是修改了页面中节点内容,获取表格数据的时候会发现表格数据还是没有变化。修改单元格的数据要用到table.cell().data()这个方法,可以获取和修改单元格的数据,cell的参数是要操作的单元格的dom节点,data不传参数是获取数据,传入参数是修改数据。

    select形式遇到了一个坑,就是在点击单元格出现select下拉框后,发现下拉不下来,后来发现是因为点击select下拉框的时候触发了事件冒泡,导致又执行了一遍点击单元格的事件,所以select又重新生成了一遍导致展不开。所以给select的点击事件里加了阻止事件冒泡 e.stopPropagation()。另外本来打算点击单元格的时候出现下拉框并且自动展开,选择一项后select消失并且把数据放进去,结果发现select标签貌似不支持js展开,看了下其它网上的例子都是自己用div模拟的select来展开的,退而求其次就点击单元格后再次手动点击select让它展开,以后有需求再用模拟的方式修改。

    转自《datatables表格行内编辑的实现

     

  • 相关阅读:
    图解隐马尔科夫模型【会其意】
    基于mysql对mybatis中的foreach进行深入研究
    JS-安全检测JavaScript基本数据类型和内置对象的方法
    Java-生成指定长度验证码的一种简单思路
    jQuery-表单流程导航
    JS-获取URL请求参数
    AngularJS-Uncaught Error: [$injector:modulerr]
    AngularJS-系统代码的配置和翻译
    JS-改变页面的颜色之变化核心-获取六位的随机数
    JS-为金额添加千分位逗号分割符
  • 原文地址:https://www.cnblogs.com/sylvia-Camellia/p/10562924.html
Copyright © 2011-2022 走看看