当前位置:   article > 正文

Web学习基础应用-可编辑表格_前端可编辑表格

前端可编辑表格

       


前文

         可编辑表格在JavaScript中是比较经典的基础应用,涉及的知识内容就是最普遍的增删改查的设计思路。我在基础学习的过程中学学到的就是拿到你一个作业的时候,先分析需求,构思完结构代码之后再进行消详细的代码实现。

        通过使用JavaScript,我们可以实现一个交互性强、用户友好的可编辑表格,使用户能够直接在表格中修改和更新数据,简化数据管理的过程。可编辑表格在数据输入、展示和编辑等方面具有广泛的应用。无论是构建一个在线表单、创建一个数据报表,还是设计一个动态的数据展示界面,掌握可编辑表格的概念和技术都是非常重要的。

        在本篇博客中,我们将重点讨论使用JavaScript实现可编辑表格的基础知识和技术。我们将逐步介绍相关的概念,帮助您建立对可编辑表格的全面理解。首先,我们将了解如何使用JavaScript选取和操作表格元素。我们将学习如何通过DOM (Document Object Model)访问和修改表格的行、列、单元格,以及相关的属性和样式。接下来,我们将探讨如何实现表格的编辑功能。我们将学习如何捕获用户的输入事件,并将其应用到相应的表格单元格中。我在基础学习的过程中学学到的就是拿到你一个作业的时候,先分析需求,构思完结构代码之后再进行消详细的代码实现。

       


         网页界面:


CODE       

        HTML详细代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>风灵月影宗</title>
  8. <link rel="stylesheet" href="style.css" />
  9. </head>
  10. <body>
  11. <div id="errorAlter">
  12. <span>输错啦!请输入099999的值</span>
  13. </div>
  14. <div class="header">
  15. <h1>风灵月影</h1>
  16. </div>
  17. <div class="tableDiv">
  18. <table>
  19. <thead>
  20. <tr>
  21. <th>编号</th>
  22. <th>姓名</th>
  23. <th>生命力</th>
  24. <th>攻击力</th>
  25. <th>防御力</th>
  26. <th>耐力</th>
  27. <th>移速</th>
  28. <th>攻速</th>
  29. <th>操作</th>
  30. </tr>
  31. </thead>
  32. <tbody id="addNewTdArea">
  33. <tr>
  34. <td><span class="item2" title="胆敢向神伸出爪牙?">0</span></td>
  35. <td><span class="item2" title="胆敢向神伸出爪牙?"></span></td>
  36. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  37. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  38. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  39. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  40. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  41. <td><span class="item2" title="胆敢向神伸出爪牙?">99999</span></td>
  42. <td>————</td>
  43. <!--
  44. <td>0</td>
  45. <td></td>
  46. <td>99999</td>
  47. <td>99999</td>
  48. <td>99999</td>
  49. <td>99999</td>
  50. <td>99999</td>
  51. <td>99999</td>
  52. <td>————</td>
  53. -->
  54. </tr>
  55. <tr class="delPower">
  56. <td>114514</td>
  57. <td>李田所</td>
  58. <td name="upData">1919</td>
  59. <td name="upData">8</td>
  60. <td name="upData">10</td>
  61. <td name="upData">20</td>
  62. <td name="upData">33.5</td>
  63. <td name="upData">20</td>
  64. <td class="delTrBtn">踢出队伍</td>
  65. </tr>
  66. <tr class="delPower">
  67. <td>414</td>
  68. <td>丘比</td>
  69. <td name="upData">414</td>
  70. <td name="upData">414</td>
  71. <td name="upData">414</td>
  72. <td name="upData">414</td>
  73. <td name="upData">414</td>
  74. <td name="upData">414</td>
  75. <td class="delTrBtn">踢出队伍</td>
  76. </tr>
  77. </tbody>
  78. </table>
  79. </div>
  80. <div id="setNewform">
  81. <h3>招募角色</h3>
  82. <table>
  83. <thead>
  84. <tr>
  85. <th>编号</th>
  86. <th>姓名</th>
  87. <th>生命力</th>
  88. <th>攻击力</th>
  89. <th>防御力</th>
  90. <th>耐力</th>
  91. <th>移速</th>
  92. <th>攻速</th>
  93. </tr>
  94. </thead>
  95. <tbody>
  96. <tr>
  97. <td class="inputContent"><input type="text" /></td>
  98. <td class="inputContent"><input type="text" /></td>
  99. <td class="inputContent"><input type="text" /></td>
  100. <td class="inputContent"><input type="text" /></td>
  101. <td class="inputContent"><input type="text" /></td>
  102. <td class="inputContent"><input type="text" /></td>
  103. <td class="inputContent"><input type="text" /></td>
  104. <td class="inputContent"><input type="text" /></td>
  105. </tr>
  106. </tbody>
  107. </table>
  108. </div>
  109. <input type="submit" value="确定招募" id="addTrBtn" />
  110. <div id="errorInputId">
  111. <h4>编号是不是有点问题捏?(1~999999的纯数字)</h4>
  112. </div>
  113. <div id="errorInputName">
  114. <h4>姓名是不是有点问题捏?(16位英文字符)</h4>
  115. </div>
  116. <div id="errorInputProperty">
  117. <h4>属性是不是有点问题捏?(1~999999的纯数字)</h4>
  118. </div>
  119. <div class="tips">
  120. <ul>
  121. <li>本表格仅仅实现部分数值的修改,数值在099999之间</li>
  122. <li>角色的添加和增加工作均开发完成</li>
  123. <li>json尚未包装</li>
  124. <li>后续开发工作有</li>
  125. <li>属性报错的时候指出是哪个属性报错</li>
  126. <li>在玩家设置编号的时候将编号设为唯一值,不可重复</li>
  127. <li>开放姓名的可编辑性</li>
  128. <li>更好的Css样式</li>
  129. </ul>
  130. </div>
  131. </body>
  132. <script src="script.js"></script>
  133. </html>

        CSS代码如下:

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. .header {
  6. margin: 70px auto;
  7. text-align: center;
  8. }
  9. .tableDiv {
  10. margin: 10px;
  11. }
  12. table {
  13. border-collapse: collapse;
  14. width: 100%;
  15. margin-bottom: 20px;
  16. }
  17. table th {
  18. background-color: #f2f2f2;
  19. border: 1px solid #ddd;
  20. padding: 10px;
  21. text-align: left;
  22. font-weight: bold;
  23. }
  24. table td {
  25. position: relative;
  26. border: 1px solid #ddd;
  27. padding: 10px;
  28. text-align: left;
  29. }
  30. /*
  31. table tr:nth-child(even) {
  32. background-color: #f2f2f2;
  33. }
  34. */
  35. table tr td:hover {
  36. background-color: #e6f7ff;
  37. }
  38. .tableDiv > table > tbody > tr > td > span {
  39. width: 90%;
  40. }
  41. .tableDiv > table > tbody > tr > td > input {
  42. width: 100%;
  43. height: 100%;
  44. border: 2px solid red;
  45. padding-left: 10px;
  46. box-sizing: border-box;
  47. position: absolute;
  48. top: 0;
  49. left: 0;
  50. font-size: 16px;
  51. }
  52. .tips {
  53. border: 1px solid gray;
  54. width: 500px;
  55. padding: 20px;
  56. margin: 20px 50px;
  57. }
  58. .tips ul li {
  59. margin: 5px;
  60. }
  61. /* newpart */
  62. /* 萌娘百科黑幕 究极修订版*/
  63. .item2 {
  64. color: transparent;
  65. background-color: black;
  66. transition: all 0.5s ease;
  67. padding: 5px;
  68. border-radius: 3px;
  69. position: relative;
  70. display: inline-block;
  71. z-index: 1;
  72. }
  73. .item2:before {
  74. content: "";
  75. display: block;
  76. width: 100%;
  77. height: 100%;
  78. position: absolute;
  79. top: 0;
  80. left: 0;
  81. z-index: -1;
  82. background-image: inherit;
  83. filter: blur(10px);
  84. transform: scale(1.2);
  85. opacity: 0;
  86. transition: opacity 0.5s ease;
  87. }
  88. .item2:hover:before {
  89. opacity: 1;
  90. }
  91. .item2:hover {
  92. color: white;
  93. }
  94. #setNewform {
  95. margin: 10px;
  96. }
  97. #setNewform > h3 {
  98. margin: 30px auto;
  99. text-align: center;
  100. }
  101. #setNewform > table > tbody > tr > td > input {
  102. width: 100%;
  103. height: 200%;
  104. padding-left: 10px;
  105. box-sizing: border-box;
  106. position: absolute;
  107. top: 0;
  108. left: 0;
  109. font-size: 20px;
  110. }
  111. input[type="submit"] {
  112. display: block;
  113. margin: 20px auto;
  114. margin-top: 40px;
  115. padding: 10px 20px;
  116. background-color: #4caf50;
  117. color: #fff;
  118. border: none;
  119. border-radius: 5px;
  120. font-size: 16px;
  121. cursor: pointer;
  122. }
  123. /* 用户修改报错 */
  124. #errorAlter {
  125. position: fixed;
  126. top: -100px;
  127. left: 0;
  128. width: 100%;
  129. background-color: #ffcc00;
  130. color: #333;
  131. font-size: 18px;
  132. text-align: center;
  133. padding: 10px 0;
  134. transition: top 0.3s ease-in-out;
  135. }
  136. #errorAlter.show {
  137. top: 0;
  138. }
  139. /* 用户输入太离谱报错 */
  140. #errorInputId {
  141. display: none;
  142. background-color: #ff9999;
  143. border: 2px solid #ff6666;
  144. color: #660000;
  145. padding: 10px;
  146. text-align: center;
  147. margin-top: 10px;
  148. animation: shake 0.3s ease-in-out;
  149. }
  150. #errorInputId h4 {
  151. font-size: 16px;
  152. font-weight: bold;
  153. margin: 0;
  154. }
  155. #errorInputName {
  156. display: none;
  157. background-color: #ff9999;
  158. border: 2px solid #ff6666;
  159. color: #660000;
  160. padding: 10px;
  161. text-align: center;
  162. margin-top: 10px;
  163. animation: shake 0.3s ease-in-out;
  164. }
  165. #errorInputName h4 {
  166. font-size: 16px;
  167. font-weight: bold;
  168. margin: 0;
  169. }
  170. #errorInputProperty {
  171. display: none;
  172. background-color: #ff9999;
  173. border: 2px solid #ff6666;
  174. color: #660000;
  175. padding: 10px;
  176. text-align: center;
  177. margin-top: 10px;
  178. animation: shake 0.3s ease-in-out;
  179. }
  180. #errorInputProperty h4 {
  181. font-size: 16px;
  182. font-weight: bold;
  183. margin: 0;
  184. }
  185. /* 小抖一下 */
  186. @keyframes shake {
  187. 0% {
  188. transform: translateX(0);
  189. }
  190. 10% {
  191. transform: translateX(-10px);
  192. }
  193. 20% {
  194. transform: translateX(10px);
  195. }
  196. 30% {
  197. transform: translateX(-10px);
  198. }
  199. 40% {
  200. transform: translateX(10px);
  201. }
  202. 50% {
  203. transform: translateX(-10px);
  204. }
  205. 60% {
  206. transform: translateX(10px);
  207. }
  208. 70% {
  209. transform: translateX(-10px);
  210. }
  211. 80% {
  212. transform: translateX(10px);
  213. }
  214. 90% {
  215. transform: translateX(-10px);
  216. }
  217. 100% {
  218. transform: translateX(0);
  219. }
  220. }

        JS代码如下:

  1. //角色修改数值模块
  2. var upDatas = document.getElementsByName("upData");
  3. // 给角色的数值模块添加事件绑定
  4. function setTdCilck() {
  5. for (let i = 0; i < upDatas.length; i++) {
  6. upDatas[i].onclick = function () {
  7. updateTd(this);
  8. };
  9. }
  10. }
  11. setTdCilck();
  12. //报错提示 升级版
  13. const inputElement = document.getElementById("input-element");
  14. const errorContainer = document.getElementById("errorAlter");
  15. function showError() {
  16. errorContainer.classList.add("show");
  17. }
  18. function hideError() {
  19. errorContainer.classList.remove("show");
  20. }
  21. // 角色修改数值函数
  22. function updateTd(newContent) {
  23. if (document.getElementsByClassName("active-input").length == 0) {
  24. var oldhtml = newContent.innerHTML;
  25. newContent.innerHTML = "";
  26. var newInput = document.createElement("input");
  27. newInput.setAttribute("class", "active-input");
  28. newInput.value = oldhtml;
  29. const reg = /^[1-9][0-9]{0,4}$/;
  30. newInput.onblur = function () {
  31. if (reg.test(this.value)) {
  32. newContent.innerHTML = this.value;
  33. hideError();
  34. } else {
  35. showError();
  36. newContent.innerHTML = oldhtml;
  37. }
  38. };
  39. newContent.appendChild(newInput);
  40. } else {
  41. return;
  42. }
  43. }
  44. //添加新角色模块
  45. var trs = document.getElementsByTagName("tr"); //获取所有的tr元素
  46. var tds = document.querySelectorAll(".inputContent input"); // 获取所有的 input 元素
  47. var addNewTdArea = document.getElementById("addNewTdArea"); //获取tbody标签,以方便在它的后面添加子队员(tr)
  48. var addTrBtn = document.getElementById("addTrBtn"); //获取确定招募队友的btn
  49. var errorInputId = document.getElementById("errorInputId"); //获取编号报错的Div
  50. var errorInputName = document.getElementById("errorInputName"); //获取姓名报错的Div
  51. var errorInputProperty = document.getElementById("errorInputProperty"); //获取属性报错的Div
  52. //添加角色函数
  53. function addTr(tds) {
  54. //给招募队友按钮绑定事件
  55. addTrBtn.onclick = function () {
  56. var userInputValue = []; //定义空数组,用于保存用户输入的input里的值
  57. for (let i = 0; i < tds.length; i++) {
  58. userInputValue[i] = tds[i].value; // 获取 input 元素的值
  59. }
  60. //给用户输入的数据做验证,不要太离谱
  61. //编号部分 编号限定在1999999之间的数字,可以重复。
  62. const idTest = /^[1-9][0-9]{0,5}$/;
  63. if (idTest.test(userInputValue[0])) {
  64. //编号通过!
  65. errorInputId.setAttribute("style", "display:none"); //隐藏编号报错
  66. //姓名部分 姓名限定在16位的英文字符,可以重复
  67. const nameTest = /^[a-zA-Z]{1,6}$/;
  68. if (nameTest.test(userInputValue[1])) {
  69. //姓名通过!
  70. errorInputName.setAttribute("style", "display:none"); //隐藏姓名报错
  71. //数值部分,因为最好不要套太多if 所以就一起验证了算了(,数值限定在199999的数字,可以重复
  72. const propertyTest = /^[1-9][0-9]{0,4}$/;
  73. let allValid = true; //定义allValid用于判断属性是否通过的循环验证
  74. for (let i = 2; i < userInputValue.length; i++) {
  75. if (!propertyTest.test(userInputValue[i])) {
  76. allValid = false; //allValid为false说明属性数组里有不符合规则的值
  77. break; //直接退出!!!!
  78. }
  79. }
  80. if (allValid) {
  81. //数值通过!
  82. errorInputProperty.setAttribute("style", "display:none"); //隐藏属性报错
  83. //创建标签用于插入tbody的下面
  84. const row = `<tr>
  85. <td>${userInputValue[0]}</td>
  86. <td>${userInputValue[1]}</td>
  87. <td name="upData">${userInputValue[2]}</td>
  88. <td name="upData">${userInputValue[3]}</td>
  89. <td name="upData">${userInputValue[4]}</td>
  90. <td name="upData">${userInputValue[5]}</td>
  91. <td name="upData">${userInputValue[6]}</td>
  92. <td name="upData">${userInputValue[7]}</td>
  93. <td class="delTrBtn1">踢出队伍</td>
  94. </tr>`;
  95. // 将新角色添加到队伍中
  96. var newRow = addNewTdArea.insertRow(); // 创建新行
  97. newRow.innerHTML = row;
  98. // 给新角色绑定修改功能
  99. setTdCilck();
  100. //给新角色绑定踢出功能
  101. var newDelTrBtn = newRow.querySelector(".delTrBtn1"); // 获取 "踢出队伍" 按钮
  102. newDelTrBtn.onclick = function () {
  103. // 给按钮添加点击事件监听器
  104. var confirmed = confirm("确定踢出这位角色吗?");
  105. if (confirmed) {
  106. // 如果用户点击了确定按 钮,则返回 alert("已踢出")
  107. addNewTdArea.deleteRow(newRow.rowIndex - 1); // 删除对应的行
  108. alert("已踢出");
  109. hideError();
  110. } else {
  111. // 如果用户点击了取消按钮,则返回 alert("这都不踢?")
  112. return alert("这都不踢?");
  113. }
  114. };
  115. //创建完角色后将用户输入置空 人性化设计
  116. for (var i = 0; i < tds.length; i++) {
  117. tds[i].value = "";
  118. }
  119. } else {
  120. errorInputProperty.setAttribute("style", "display:block"); //属性输入报错
  121. }
  122. } else {
  123. errorInputName.setAttribute("style", "display:block"); //姓名输入报错
  124. }
  125. } else {
  126. errorInputId.setAttribute("style", "display:block"); //编号输入报错
  127. }
  128. };
  129. }
  130. addTr(tds);
  131. //删除模块
  132. var trss = document.getElementsByClassName("delPower"); // 获取原始队伍里的两个角色的tr
  133. var delTrBtn = document.getElementsByClassName("delTrBtn"); //获取原始队伍里的两个角色的踢出队伍操作
  134. //给踢出队伍的tr绑定删除事件
  135. function setTrDel() {
  136. for (let i = 0; i < delTrBtn.length; i++) {
  137. delTrBtn[i].onclick = function () {
  138. delTr(i);
  139. };
  140. }
  141. }
  142. setTrDel();
  143. //删除函数本体
  144. function delTr(i) {
  145. // 使用 confirm 函数弹出提示框
  146. var confirmed = confirm("确定踢出这位角色吗?");
  147. if (confirmed) {
  148. trss[i].remove(); //直接踢出当前点击的角色(移除它的tr)
  149. alert("已踢出");
  150. hideError();
  151. } else {
  152. alert("这都不踢?");
  153. }
  154. //重新绑定(这个地方搞半天了)
  155. setTrDel();
  156. }

        HTML与CSS代码作为基本网页结构代码就不做讲解。更多的重心应该在JS的实现上面。

角色修改数值模块


JS功能模块分析

        修改数值模块:

  1. var upDatas = document.getElementsByName("upData");
  2. // 给角色的数值模块添加事件绑定
  3. function setTdCilck() {
  4. for (let i = 0; i < upDatas.length; i++) {
  5. upDatas[i].onclick = function () {
  6. updateTd(this);
  7. };
  8. }
  9. }
  10. setTdCilck();
  11. //报错提示 升级版
  12. const inputElement = document.getElementById("input-element");
  13. const errorContainer = document.getElementById("errorAlter");
  14. function showError() {
  15. errorContainer.classList.add("show");
  16. }
  17. function hideError() {
  18. errorContainer.classList.remove("show");
  19. }
  20. // 角色修改数值函数
  21. function updateTd(newContent) {
  22. if (document.getElementsByClassName("active-input").length == 0) {
  23. var oldhtml = newContent.innerHTML;
  24. newContent.innerHTML = "";
  25. var newInput = document.createElement("input");
  26. newInput.setAttribute("class", "active-input");
  27. newInput.value = oldhtml;
  28. const reg = /^[1-9][0-9]{0,4}$/;
  29. newInput.onblur = function () {
  30. if (reg.test(this.value)) {
  31. newContent.innerHTML = this.value;
  32. hideError();
  33. } else {
  34. showError();
  35. newContent.innerHTML = oldhtml;
  36. }
  37. };
  38. newContent.appendChild(newInput);
  39. } else {
  40. return;
  41. }
  42. }

        在这段代码中,我们首先通过document.getElementsByName("upData")获取了所有具有name属性为"upData"的元素,这些元素对应可编辑的表格单元格。接着,我们使用setTdCilck()函数给这些表格单元格添加了点击事件监听器。也就是绑定点击修改事件

        在点击事件处理函数updateTd()中,我们首先检查是否已经有其他表格单元格正在编辑状态,如果是,则直接返回,避免重复编辑。然后,我们获取被点击的表格单元格的内容,并将其替换为空。接下来,创建一个input元素,并设置其class为"active-input",将之前的表格单元格内容赋值给inputvalue属性。然后,我们定义了一个正则表达式reg用于验证用户输入的数值是否符合规定格式。在inputblur事件中,我们进行数值的验证,如果通过验证,则将用户输入的数值赋值给表格单元格,并隐藏错误提示;如果验证不通过,则显示错误提示,并恢复表格单元格原本的内容。通过以上的代码,我们实现了在可编辑表格中修改数值的功能,并对用户输入进行了简单的格式验证和错误提示。

       接下来,我们将继续探讨其他功能模块,如添加新角色和删除角色模块,以完善我们的可编辑表格应用程序。


        添加角色模块:
 

  1. //添加新角色模块
  2. var trs = document.getElementsByTagName("tr"); //获取所有的tr元素
  3. var tds = document.querySelectorAll(".inputContent input"); // 获取所有的 input 元素
  4. var addNewTdArea = document.getElementById("addNewTdArea"); //获取tbody标签,以方便在它的后面添加子队员(tr)
  5. var addTrBtn = document.getElementById("addTrBtn"); //获取确定招募队友的btn
  6. var errorInputId = document.getElementById("errorInputId"); //获取编号报错的Div
  7. var errorInputName = document.getElementById("errorInputName"); //获取姓名报错的Div
  8. var errorInputProperty = document.getElementById("errorInputProperty"); //获取属性报错的Div
  9. //添加角色函数
  10. function addTr(tds) {
  11. //给招募队友按钮绑定事件
  12. addTrBtn.onclick = function () {
  13. var userInputValue = []; //定义空数组,用于保存用户输入的input里的值
  14. for (let i = 0; i < tds.length; i++) {
  15. userInputValue[i] = tds[i].value; // 获取 input 元素的值
  16. }
  17. //给用户输入的数据做验证,不要太离谱
  18. //编号部分 编号限定在1999999之间的数字,可以重复。
  19. const idTest = /^[1-9][0-9]{0,5}$/;
  20. if (idTest.test(userInputValue[0])) {
  21. //编号通过!
  22. errorInputId.setAttribute("style", "display:none"); //隐藏编号报错
  23. //姓名部分 姓名限定在16位的英文字符,可以重复
  24. const nameTest = /^[a-zA-Z]{1,6}$/;
  25. if (nameTest.test(userInputValue[1])) {
  26. //姓名通过!
  27. errorInputName.setAttribute("style", "display:none"); //隐藏姓名报错
  28. //数值部分,因为最好不要套太多if 所以就一起验证了算了(,数值限定在199999的数字,可以重复
  29. const propertyTest = /^[1-9][0-9]{0,4}$/;
  30. let allValid = true; //定义allValid用于判断属性是否通过的循环验证
  31. for (let i = 2; i < userInputValue.length; i++) {
  32. if (!propertyTest.test(userInputValue[i])) {
  33. allValid = false; //allValid为false说明属性数组里有不符合规则的值
  34. break; //直接退出!!!!
  35. }
  36. }
  37. if (allValid) {
  38. //数值通过!
  39. errorInputProperty.setAttribute("style", "display:none"); //隐藏属性报错
  40. //创建标签用于插入tbody的下面
  41. const row = `<tr>
  42. <td>${userInputValue[0]}</td>
  43. <td>${userInputValue[1]}</td>
  44. <td name="upData">${userInputValue[2]}</td>
  45. <td name="upData">${userInputValue[3]}</td>
  46. <td name="upData">${userInputValue[4]}</td>
  47. <td name="upData">${userInputValue[5]}</td>
  48. <td name="upData">${userInputValue[6]}</td>
  49. <td name="upData">${userInputValue[7]}</td>
  50. <td class="delTrBtn1">踢出队伍</td>
  51. </tr>`;
  52. // 将新角色添加到队伍中
  53. var newRow = addNewTdArea.insertRow(); // 创建新行
  54. newRow.innerHTML = row;
  55. // 给新角色绑定修改功能
  56. setTdCilck();
  57. //给新角色绑定踢出功能
  58. var newDelTrBtn = newRow.querySelector(".delTrBtn1"); // 获取 "踢出队伍" 按钮
  59. newDelTrBtn.onclick = function () {
  60. // 给按钮添加点击事件监听器
  61. var confirmed = confirm("确定踢出这位角色吗?");
  62. if (confirmed) {
  63. // 如果用户点击了确定按 钮,则返回 alert("已踢出")
  64. addNewTdArea.deleteRow(newRow.rowIndex - 1); // 删除对应的行
  65. alert("已踢出");
  66. hideError();
  67. } else {
  68. // 如果用户点击了取消按钮,则返回 alert("这都不踢?")
  69. return alert("这都不踢?");
  70. }
  71. };
  72. //创建完角色后将用户输入置空 人性化设计
  73. for (var i = 0; i < tds.length; i++) {
  74. tds[i].value = "";
  75. }
  76. } else {
  77. errorInputProperty.setAttribute("style", "display:block"); //属性输入报错
  78. }
  79. } else {
  80. errorInputName.setAttribute("style", "display:block"); //姓名输入报错
  81. }
  82. } else {
  83. errorInputId.setAttribute("style", "display:block"); //编号输入报错
  84. }
  85. };
  86. }
  87. addTr(tds);

添加角色模块的实现。这个模块允许用户输入角色的信息,并将其添加到表格中。

代码中的addTr函数是添加角色的核心函数。它通过监听"招募队友"按钮的点击事件来触发角色添加操作。当按钮被点击时,该函数会执行以下步骤:

  1. 从HTML页面中获取用户输入的角色信息,并保存在userInputValue数组中。
  2. 使用正则表达式进行数据验证,确保编号、姓名和属性值符合特定的格式要求。
  3. 如果验证通过,创建一个新的HTML字符串表示角色的表格行,并将其插入到表格中。
  4. 为新添加的角色行绑定事件处理程序,以实现修改和删除功能。
  5. 清空用户输入的文本框,为下一次输入做准备。
  6. 如果验证未通过,根据具体的验证错误显示相应的报错信息。

通过这个添加角色模块,用户可以逐步输入角色的编号、姓名和属性值,系统会根据输入的数据动态创建表格行,并为每个角色提供修改和删除功能。这样用户就可以方便地管理角色数据。


        角色删除模块:

  1. var trss = document.getElementsByClassName("delPower"); // 获取原始队伍里的两个角色的tr
  2. var delTrBtn = document.getElementsByClassName("delTrBtn"); //获取原始队伍里的两个角色的踢出队伍操作
  3. //给踢出队伍的tr绑定删除事件
  4. function setTrDel() {
  5. for (let i = 0; i < delTrBtn.length; i++) {
  6. delTrBtn[i].onclick = function () {
  7. delTr(i);
  8. };
  9. }
  10. }
  11. setTrDel();
  12. //删除函数本体
  13. function delTr(i) {
  14. // 使用 confirm 函数弹出提示框
  15. var confirmed = confirm("确定踢出这位角色吗?");
  16. if (confirmed) {
  17. trss[i].remove(); //直接踢出当前点击的角色(移除它的tr)
  18. alert("已踢出");
  19. hideError();
  20. } else {
  21. alert("这都不踢?");
  22. }
  23. //重新绑定(这个地方搞半天了)
  24. setTrDel();
  25. }

        代码中通过document.getElementsByClassName获取了原始队伍中的角色行和踢出队伍操作按钮的元素集合。接下来,定义了setTrDel函数用于绑定删除事件。setTrDel函数通过遍历delTrBtn元素集合,为每个踢出按钮绑定点击事件。当按钮被点击时,会调用delTr函数,并将相应的角色行的索引作为参数传递给它。

delTr函数是删除操作的核心函数。它执行以下操作:

  1. 使用confirm函数弹出确认对话框,询问用户是否确定删除该角色。
  2. 如果用户点击了确认按钮,将直接从表格中移除当前点击的角色行(使用remove()方法)。
  3. 显示一个提示框,告知用户角色已被成功移除。
  4. 调用hideError函数,隐藏可能存在的错误提示信息。
  5. 最后,重新绑定删除事件,以保证删除功能在表格中的角色行更新后仍然有效。

     通过这个删除模块,用户可以选择要删除的角色,并在确认后将其从表格中移除。这样用户可以方便地管理队伍中的角色。


总结:

        在本博客中,我们学习了基于Web技术的可编辑表格应用。通过使用JavaScript、HTML和CSS,我们成功实现了角色修改数值、添加新角色和删除角色的功能。

        通过角色修改数值模块,用户可以点击数值单元格,将其转换为可编辑状态,并更新数值。我们还加入了输入验证功能,确保用户输入的数值符合规定的范围。

        添加新角色模块允许用户输入角色的编号、姓名和数值,并将其添加到表格中。我们对用户输入进行了验证,以确保数据的准确性和合法性。

        删除模块允许用户从表格中踢出不需要的角色。用户可以点击相应的删除按钮,并在确认后将角色从表格中移除。

        通过这个完整的可编辑表格应用示例,我们深入了解了Web开发中的前端技术。JavaScript作为核心语言,驱动着应用的交互逻辑。HTML和CSS则负责呈现用户界面和样式效果。通过学习这个应用示例,我们掌握了一些基础的Web开发技巧,例如DOM操作、事件处理、输入验证和动态元素创建。这些技术对于构建更复杂的Web应用和提升用户体验非常重要。

        希望本博客能够帮助你打下坚实的Web开发基础,启发你在实际项目中应用这些技术。如果你对这个应用有任何疑问或想进一步拓展它,欢迎留言讨论。感谢你的阅读。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/779703
推荐阅读
相关标签
  

闽ICP备14008679号