js动态添加table 添加行列,删除行列

该博客主要展示了如何使用Vue.js实现一个简单的表格编辑功能,包括添加行、添加列、删除指定行和列,以及单元格的双击编辑。代码中提供了详细的DOM操作方法,用于动态更新表格结构。此外,还实现了输入框验证以确保至少保留指定数量的行和列。
摘要由CSDN通过智能技术生成

<template>
  <div class="table-box">
    <div class="code">
      <textarea id="textarea" v-model="tablecode"></textarea>
    </div>
    <div class="tablebox">
      <div class="operation">
        <Button style="margin-right: 15px" type="primary" @click="addRows"
          >添加行</Button
        >
        <Button style="margin-right: 15px" type="primary" @click="addColumn"
          >添加列</Button
        >
        <InputNumber v-model="deleteRowValue" :min="3"></InputNumber>
        <Button style="margin-right: 15px" type="error" @click="deleteRows()"
          >删除行</Button
        >
        <InputNumber v-model="deleleColumnValue" :min="2"></InputNumber>
        <Button style="margin-right: 15px" type="error" @click="deleleColumn()"
          >删除列</Button
        >
      </div>
      <div id="table-main">
        <table
          cellspacing="0"
          width="100%"
          bordercolorlight="#333333"
          bordercolordark="#efefef"
        >
          <tr>
            <th style="text-align: center"></th>
          </tr>
          <tr>
            <td style="text-align: center"></td>
          </tr>
        </table>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "table",
  components: {},

  data() {
    return {
      tablecode: "",
      deleteRowValue: 3,
      deleleColumnValue: 2,
    };
  },
  watch: {
    tablecode: {
      deep: true,
      handler: function (val) {
        if (val) {
          document.getElementById("table-main").innerHTML = val;
        }
      },
    },
  },
  methods: {
    // 添加行
    addRows() {
      debugger;
      let table = document.getElementsByTagName("table")[0];
      let lastRow = table.rows[table.rows.length - 1];
      let newRow = lastRow.cloneNode(true);
      let tds = newRow.getElementsByTagName("td");
      for (let i = 0; i < tds.length; i++) {
        tds[i].innerHTML = ``;
      }
      let row = table.insertRow();
      row.innerHTML = this.nodeToString(newRow);
      this.getTableDom();
    },
    // 添加列
    addColumn() {
      let table = document.getElementsByTagName("table")[0];
      let rowLength = table.rows.length; //行数
      let columnLength = table.rows[1].cells.length; //列数
      var th = document.createElement("th");
      table.rows[0].appendChild(th);
      for (let i = 1; i < rowLength; i++) {
        let oTd = table.rows[i].insertCell(columnLength);
      }
      this.getTableDom();
    },
    // 删除指定行
    deleteRows() {
      let table = document.getElementsByTagName("table")[0];
      let rows_num = table.rows.length;
      if (rows_num > this.deleteRowValue - 1) {
        table.deleteRow(this.deleteRowValue - 1);
      }
    },
    // 删除指定列
    deleleColumn() {
      let table = document.getElementsByTagName("table")[0];
      let colums_num = table.rows[0].cells.length;
      if (colums_num > this.deleleColumnValue - 1) {
        for (var i = 0; i < table.rows.length; i++) {
          table.rows[i].deleteCell(this.deleleColumnValue - 1);
        }
      }
    },
    // 将dom转成string
    nodeToString(node) {
      let tmpNode = document.createElement("div");
      tmpNode.appendChild(node.cloneNode(true));
      let str = tmpNode.innerHTML;
      tmpNode = node = null;
      if (str.indexOf("data-v-") > -1) {
        let keyname = (" " + str).slice(1);
        keyname = keyname.substring(
          keyname.indexOf("data-v-"),
          keyname.indexOf('=""') + 3
        );
        var a = str.split(keyname);
        var b = a.join("");
        return b;
      }
      return str;
    },
    // 双击编辑
    changeTotext(obj) {
      //获取标签内的文本值
      let tdValue = obj.innerText;
      obj.innerText = "";
      //创建input标签对象
      let txt = document.createElement("input");
      txt.type = "text";
      //将文本值赋给input的value
      txt.value = tdValue;
      //新建input的id值(可以用数据库的ID值)
      txt.id = "_text_000000000_";
      //添加input节点,并放到td中
      obj.appendChild(txt);
      //选取域中的文本(双击时文本全选)
      txt.select();
      //双击之后改变样式
      obj.style.border = "1px dashed #ff9900";
      txt.style.border = "0px";
      txt.style.outline = "none";
    },
    // 取消单元格中的文本框,并将文本框中的值赋给单元格
    cancel(obj) {
      let txtValue = document.getElementById("_text_000000000_").value;
      //更改之后的值
      obj.innerText = txtValue;
      obj.style.border = "";
      obj.style.textAlign = "center";
      this.getTableDom();
    },
    // 获取dom
    getTableDom() {
      let table = document.getElementsByTagName("table")[0];
      this.tablecode = this.nodeToString(table);
    },
  },
  mounted() {
    let self = this;
    self.getTableDom();
    // 事件
    document.ondblclick = function () {
      //取得标签属性
      if (event.srcElement.tagName.toLowerCase() == "td") {
        //获得触发事件的元素
        //对象
        self.changeTotext(event.srcElement);
      }
      if (event.srcElement.tagName.toLowerCase() == "th") {
        //获得触发事件的元素
        //对象
        self.changeTotext(event.srcElement);
      }
    };
    //当鼠标抬起执行
    document.onmouseup = function () {
      if (
        document.getElementById("_text_000000000_") &&
        event.srcElement.id != "_text_000000000_"
      ) {
        let obj = document.getElementById("_text_000000000_").parentElement;
        self.cancel(obj);
      }
    };
  },
};
</script>
<style scoped>
.table-box {
  width: 100%;
  height: 100%;
}
.tablebox {
  height: 100%;
  width: 70%;
  float: left;
  background: #fff;
  border: 1px solid#ccc;
  overflow: scroll;
}
.operation {
  height: 60px;
  background: #f7f7f7;
  border-bottom: 1px solid#ccc;
  padding-top: 12px;
  padding-left: 5px;
}
.code {
  height: 100%;
  width: 30%;
  float: left;
  background: #f7f7f7;
  border: 1px solid#ccc;
}
.code #textarea {
  border: none;
  /* overflow: scroll; */
  height: 100%;
  width: 100%;
}
table tr th,
table tr td {
  border: solid 1px #ddd;
  border-collapse: collapse;
  height: 23px;
}
</style>
<style >
table tr th,
table tr td {
  border: solid 1px #ddd;
  border-collapse: collapse;
  height: 23px;
  min-width: 100px !important;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的JavaScript表格行列合计计算案例: HTML代码: ```html <table id="myTable"> <thead> <tr> <th>商品</th> <th>价格</th> <th>数量</th> <th>小计</th> </tr> </thead> <tbody> <tr> <td>商品A</td> <td>10.00</td> <td><input type="number" value="1" onchange="updateSubtotal(this)"></td> <td class="subtotal"></td> </tr> <tr> <td>商品B</td> <td>20.00</td> <td><input type="number" value="2" onchange="updateSubtotal(this)"></td> <td class="subtotal"></td> </tr> <tr> <td>商品C</td> <td>30.00</td> <td><input type="number" value="3" onchange="updateSubtotal(this)"></td> <td class="subtotal"></td> </tr> </tbody> <tfoot> <tr> <th colspan="2">合计</th> <td id="totalQty"></td> <td id="total"></td> </tr> </tfoot> </table> ``` JavaScript代码: ```javascript function updateSubtotal(input) { var row = input.parentNode.parentNode; var price = row.cells[1].textContent; var qty = input.value; var subtotal = price * qty; row.cells[3].textContent = subtotal.toFixed(2); updateTotal(); } function updateTotal() { var totalQty = 0; var total = 0; var rows = document.getElementById("myTable").rows; for (var i = 1; i < rows.length - 1; i++) { var qty = parseInt(rows[i].cells[2].children[0].value); var subtotal = parseFloat(rows[i].cells[3].textContent); totalQty += qty; total += subtotal; } document.getElementById("totalQty").textContent = totalQty; document.getElementById("total").textContent = total.toFixed(2); } ``` 该代码中,我们首先定义了一个`updateSubtotal`函数,它接收一个输入元素作为参数,计算并更新该行的小计。然后我们定义了一个`updateTotal`函数,它循环所有行(除了表头和表尾),并计算行数和总计。最后,我们在输入元素的`onchange`事件和页面加载时调用`updateTotal`函数来更新表格的合计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侧耳倾听...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值