【问题标题】:How to Make Html Table Column editable?如何使 Html 表格列可编辑?
【发布时间】:2019-01-09 08:02:09
【问题描述】:

我有一个包含一些 JSON 数据的 HTML 表,我想将我的列之一设为 editable,例如在用户单击或双击时,该单元格应该是可编辑的

我不知道如何实现这一目标。 在谷歌上搜索我发现<td contenteditable='true'></td> 使用它我可以使单元格可编辑但动态我不知道如何使用它

片段

$(document).ready(function() {

  var tableData = [{
      "Category Code": "C001",
      "Category Name": "Beverages",
      "Quantity": "3174.0000"

    },
    {
      "Category Code": "C003",
      "Category Name": "Juices",
      "Quantity": "36.0000"

    },
    {
      "Category Code": "C004",
      "Category Name": "Soups",
      "Quantity": "5.0000"

    },
    {
      "Category Code": "C005",
      "Category Name": "Cookies",
      "Quantity": "10.0000"

    },
    {
      "Category Code": "C006",
      "Category Name": "Buns",
      "Quantity": "258.0000"

    },
    {
      "Category Code": "C007",
      "Category Name": "Breads",
      "Quantity": "184.0000"

    },
    {
      "Category Code": "C008",
      "Category Name": "Rusks",
      "Quantity": "62.0000"

    },
    {
      "Category Code": "C009",
      "Category Name": "Biscuits",
      "Quantity": "55.0000"

    },
    {
      "Category Code": "C010",
      "Category Name": "Puff",
      "Quantity": "53.0000"

    },
    {
      "Category Code": "C011",
      "Category Name": "Savouries",
      "Quantity": "343.2500"

    },
    {
      "Category Code": "C012",
      "Category Name": "Cake",
      "Quantity": "19.0000"

    }

  ]


  function addTable(tableValue) {
    var col = Object.keys(tableValue[0]);
    var countNum = col.filter(i => !isNaN(i)).length;
    var num = col.splice(0, countNum);
    col = col.concat(num);
    var table = document.createElement("table");
    var tr = table.insertRow(-1); // TABLE ROW.
    for (var i = 0; i < col.length; i++) {
      var th = document.createElement("th"); // TABLE HEADER.
      th.innerHTML = col[i];
      tr.appendChild(th);
      tr.classList.add("text-center");
      tr.classList.add("head")
    }
    for (var i = 0; i < tableValue.length; i++) {
      tr = table.insertRow(-1);
      for (var j = 0; j < col.length; j++) {
        var tabCell = tr.insertCell(-1);
        var tabledata = tableValue[i][col[j]];
        if (tabledata && !isNaN(tabledata)) {
          tabledata = parseInt(tabledata).toLocaleString('en-in')
        }
        if (tableData[i]['Quantity'] === tableData[i][col[j]]) {
          //i want to make this cell editable
          tabCell.innerHTML = tabledata;
        } else {
          span = document.createElement("span");
          span.innerHTML = tabledata;
          tabCell.appendChild(span)
        }
        if (j > 1)

          tabCell.classList.add("text-right");

      }
    }
    var divContainer = document.getElementById("HourlysalesSummary");
    divContainer.innerHTML = "";
    divContainer.appendChild(table);
    table.classList.add("table");
    table.classList.add("table-striped");
    table.classList.add("table-bordered");
    table.classList.add("table-hover");

  }
  addTable(tableData);

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
<table id="HourlysalesSummary"></table>

我想让Quantity 列数据可编辑 请问这里的任何人如何用一些好的方法来指导我会非常有帮助。

【问题讨论】:

  • 一种非常常用的技术是在单元格内有一个不可见的输入字段,然后在需要时显示/隐藏它。否则,您在某些 html 标记上也有 contenteditable 属性
  • 现在阅读。看起来有人已经为您提供了该示例,所以不需要它:)

标签: javascript jquery html


【解决方案1】:

您可以在数量单元格的情况下使用contenteditable 属性:

tabCell.setAttribute('contenteditable', true);

$(document).ready(function() {

  var tableData = [{
      "Category Code": "C001",
      "Category Name": "Beverages",
      "Quantity": "3174.0000"

    },
    {
      "Category Code": "C003",
      "Category Name": "Juices",
      "Quantity": "36.0000"

    },
    {
      "Category Code": "C004",
      "Category Name": "Soups",
      "Quantity": "5.0000"

    },
    {
      "Category Code": "C005",
      "Category Name": "Cookies",
      "Quantity": "10.0000"

    },
    {
      "Category Code": "C006",
      "Category Name": "Buns",
      "Quantity": "258.0000"

    },
    {
      "Category Code": "C007",
      "Category Name": "Breads",
      "Quantity": "184.0000"

    },
    {
      "Category Code": "C008",
      "Category Name": "Rusks",
      "Quantity": "62.0000"

    },
    {
      "Category Code": "C009",
      "Category Name": "Biscuits",
      "Quantity": "55.0000"

    },
    {
      "Category Code": "C010",
      "Category Name": "Puff",
      "Quantity": "53.0000"

    },
    {
      "Category Code": "C011",
      "Category Name": "Savouries",
      "Quantity": "343.2500"

    },
    {
      "Category Code": "C012",
      "Category Name": "Cake",
      "Quantity": "19.0000"

    }

  ]


  function addTable(tableValue) {
    var col = Object.keys(tableValue[0]);
    var countNum = col.filter(i => !isNaN(i)).length;
    var num = col.splice(0, countNum);
    col = col.concat(num);
    var table = document.createElement("table");
    var tr = table.insertRow(-1); // TABLE ROW.
    for (var i = 0; i < col.length; i++) {
      var th = document.createElement("th"); // TABLE HEADER.
      th.innerHTML = col[i];
      tr.appendChild(th);
      tr.classList.add("text-center");
      tr.classList.add("head")
    }
    for (var i = 0; i < tableValue.length; i++) {
      tr = table.insertRow(-1);
      for (var j = 0; j < col.length; j++) {
        var tabCell = tr.insertCell(-1);
        var tabledata = tableValue[i][col[j]];
        if (tabledata && !isNaN(tabledata)) {
          tabledata = parseInt(tabledata).toLocaleString('en-in')
        }
        if (tableData[i]['Quantity'] === tableData[i][col[j]]) {
          //i want to make this cell editable
          tabCell.setAttribute('contenteditable', true); // <--- ADDING HERE
          tabCell.innerHTML = tabledata;
        } else {
          span = document.createElement("span");
          span.innerHTML = tabledata;
          tabCell.appendChild(span)
        }
        if (j > 1)

          tabCell.classList.add("text-right");

      }
    }
    var divContainer = document.getElementById("HourlysalesSummary");
    divContainer.innerHTML = "";
    divContainer.appendChild(table);
    table.classList.add("table");
    table.classList.add("table-striped");
    table.classList.add("table-bordered");
    table.classList.add("table-hover");

  }
  addTable(tableData);

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
<table id="HourlysalesSummary"></table>

另一个经常使用的技术是在需要时隐藏/显示单元格内的输入

【讨论】:

    【解决方案2】:

    你需要在(td)表的cells中添加事件监听,事件应该是双击事件(dblclick),另请注意,我们必须创建一个 activeCell 变量来存储激活的单元格,

    let activeCell = null;
    let cells = document.getElementsByTagName('td');
    for(let cell of cells) {
        cell.addEventListener('dblclick', function() {
            // to do
        });
    }
    

    在事件监听器做代码块时,你需要使用 JavaScript 将 innerHTML of cell 设为 inputtextarea, p>

    for(let cell of cells) {
        cell.addEventListener('dblclick', function() {
            if(this.childElementCount == 0) {
                let input = document.createElement('input');
                input.setAttribute('type', 'textbox');
                input.setAttribute('value', this.innerHTML);
                this.innerHTML = "";
                this.appendChild(input);
                activeCell = this;
            }
        });
    }
    

    当用户在激活的表格单元格之外点击时,保存单元格输入的新值并将其恢复为普通文本,并带有 mouseup 事件监听器,

    document.addEventListener('mouseup', function(e) {
        if(activeCell != null) {
            let container = activeCell.children[0];
            if (!$(container).is(e.target) && $(container).has(e.target).length === 0) 
            {
                activeCell.innerHTML = container.value;
                activeCell = null;
            }
        }
    });
    

    我用过一些 JQuery 的方法,这些是 .is.has 用于检查单击的对象是否未激活单元格。

    最终的代码是这样的,

    let activeCell = null;
    let cells = document.getElementsByTagName('td');
    for(let cell of cells) {
        cell.addEventListener('dblclick', function() {
            if(this.childElementCount == 0) {
                let input = document.createElement('input');
                input.setAttribute('type', 'textbox');
                input.setAttribute('value', this.innerHTML);
                this.innerHTML = "";
                this.appendChild(input);
                activeCell = this;
            }
        });
    }
    document.addEventListener('mouseup', function(e) {
        if(activeCell != null) {
            let container = activeCell.children[0];
            if (!$(container).is(e.target) && $(container).has(e.target).length === 0) 
            {
                activeCell.innerHTML = container.value;
                activeCell = null;
            }
        }
    });
    

    祝你有美好的一天:)

    【讨论】:

    • 嘿,我已经尝试过您的代码,它工作正常,但问题在于单击它变成了一个输入字段,但是当我按下 tab 或通过鼠标单击新单元格进行编辑时,第一个没有t 返回单元格而不是输入字段
    • 在输入字段&lt;input type="textbox" value="258"&gt; 内单击时显示。
    • 我只是想告诉你,你应该遵循哪种方法。其他的事情是你的工作。在此之后,您需要检测输入事件之外的点击,当触发此事件时,您需要将单元格的 innerText 转换为输入值并删除输入元素。
    • 好的,它会在这里更新答案@dheerajkumar
    【解决方案3】:

    在脚本末尾添加以下内容:

     $('.text-right').attr('contenteditable', true); 
    

    $(document).ready(function() {
    
      var tableData = [{
          "Category Code": "C001",
          "Category Name": "Beverages",
          "Quantity": "3174.0000"
    
        },
        {
          "Category Code": "C003",
          "Category Name": "Juices",
          "Quantity": "36.0000"
    
        },
        {
          "Category Code": "C004",
          "Category Name": "Soups",
          "Quantity": "5.0000"
    
        },
        {
          "Category Code": "C005",
          "Category Name": "Cookies",
          "Quantity": "10.0000"
    
        },
        {
          "Category Code": "C006",
          "Category Name": "Buns",
          "Quantity": "258.0000"
    
        },
        {
          "Category Code": "C007",
          "Category Name": "Breads",
          "Quantity": "184.0000"
    
        },
        {
          "Category Code": "C008",
          "Category Name": "Rusks",
          "Quantity": "62.0000"
    
        },
        {
          "Category Code": "C009",
          "Category Name": "Biscuits",
          "Quantity": "55.0000"
    
        },
        {
          "Category Code": "C010",
          "Category Name": "Puff",
          "Quantity": "53.0000"
    
        },
        {
          "Category Code": "C011",
          "Category Name": "Savouries",
          "Quantity": "343.2500"
    
        },
        {
          "Category Code": "C012",
          "Category Name": "Cake",
          "Quantity": "19.0000"
    
        }
    
      ]
    
    
      function addTable(tableValue) {
        var col = Object.keys(tableValue[0]);
        var countNum = col.filter(i => !isNaN(i)).length;
        var num = col.splice(0, countNum);
        col = col.concat(num);
        var table = document.createElement("table");
        var tr = table.insertRow(-1); // TABLE ROW.
        for (var i = 0; i < col.length; i++) {
          var th = document.createElement("th"); // TABLE HEADER.
          th.innerHTML = col[i];
          tr.appendChild(th);
          tr.classList.add("text-center");
          tr.classList.add("head")
        }
        for (var i = 0; i < tableValue.length; i++) {
          tr = table.insertRow(-1);
          for (var j = 0; j < col.length; j++) {
            var tabCell = tr.insertCell(-1);
            var tabledata = tableValue[i][col[j]];
            if (tabledata && !isNaN(tabledata)) {
              tabledata = parseInt(tabledata).toLocaleString('en-in')
            }
            if (tableData[i]['Quantity'] === tableData[i][col[j]]) {
              //i want to make this cell editable
              tabCell.innerHTML = tabledata;
            } else {
              span = document.createElement("span");
              span.innerHTML = tabledata;
              tabCell.appendChild(span)
            }
            if (j > 1)
    
              tabCell.classList.add("text-right");
    
          }
        }
        var divContainer = document.getElementById("HourlysalesSummary");
        divContainer.innerHTML = "";
        divContainer.appendChild(table);
        table.classList.add("table");
        table.classList.add("table-striped");
        table.classList.add("table-bordered");
        table.classList.add("table-hover");
    
      }
      addTable(tableData);
      $('.text-right').attr('contenteditable', true);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css">
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
    <table id="HourlysalesSummary"></table>

    【讨论】:

    • 这很容易出错。引导程序使用text-right 将文本向右对齐。通过这种方式,您将使所有这些元素都可编辑
    猜你喜欢
    • 2011-08-26
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多