• JS-新增水果库存记录表单页面实现


    1、fruit.html

    1. html>
    2. <html lang="zh_CN">
    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>js-DOM/BOM实战title>
    8. <link href="style/fruit.css" rel="stylesheet">link>
    9. <script src="js/鼠标悬浮和离开事件.js">script>
    10. head>
    11. <body>
    12. <div id="div0">
    13. <div id="div_title">欢迎使用水果库存系统div>
    14. <div id="div2">
    15. <table id="fruit_tbl">
    16. <tr>
    17. <th class="w10"><input type="checkbox" id="ckAll"/>th>
    18. <th class="w20">名称th>
    19. <th class="w20">单价th>
    20. <th class="w20">数量th>
    21. <th class="w20">小计th>
    22. <th class="w10"><input type="button" value="批量删除" id="delsBtn"/>th>
    23. tr>
    24. <tr>
    25. <td><input type="checkbox" name="ck"/>td>
    26. <td>苹果td>
    27. <td>5td>
    28. <td>2td>
    29. <td>10td>
    30. <td><img src='imgs/del.png' class="delBtn"/>td>
    31. tr>
    32. <tr>
    33. <td><input type="checkbox" name="ck"/>td>
    34. <td>菠萝td>
    35. <td>3td>
    36. <td>5td>
    37. <td>15td>
    38. <td><img src='imgs/del.png' class="delBtn"/>td>
    39. tr>
    40. <tr>
    41. <td><input type="checkbox" name="ck"/>td>
    42. <td>哈密瓜td>
    43. <td>4td>
    44. <td>5td>
    45. <td>20td>
    46. <td><img src='imgs/del.png' class="delBtn"/>td>
    47. tr>
    48. <tr>
    49. <td><input type="checkbox" name="ck"/>td>
    50. <td>葡萄td>
    51. <td>10td>
    52. <td>5td>
    53. <td>50td>
    54. <td><img src='imgs/del.png' class="delBtn"/>td>
    55. tr>
    56. <tr>
    57. <td><input type="checkbox" name="ck"/>td>
    58. <td>青梅td>
    59. <td>10td>
    60. <td>5td>
    61. <td>50td>
    62. <td><img src='imgs/del.png' class="delBtn"/>td>
    63. tr>
    64. <tr>
    65. <td><input type="checkbox" name="ck"/>td>
    66. <td>人参果td>
    67. <td>10td>
    68. <td>5td>
    69. <td>50td>
    70. <td><img src='imgs/del.png' class="delBtn"/>td>
    71. tr>
    72. <tr>
    73. <td><input type="checkbox" name="ck"/>td>
    74. <td>菠萝蜜td>
    75. td>
    76. <td>10td>
    77. <td>5td>
    78. <td>50td>
    79. <td><img src='imgs/del.png' class="delBtn"/>td>
    80. tr>
    81. <tr>
    82. <td><input type="checkbox" name="ck"/>td>
    83. <td>西红柿td>
    84. <td>10td>
    85. <td>5td>
    86. <td>50td>
    87. <td><img src='imgs/del.png' class="delBtn"/>td>
    88. tr>
    89. <tr>
    90. <td colspan="2">总结:td>
    91. <td colspan="4">0td>
    92. tr>
    93. table>
    94. div>
    95. <div id="div3">
    96. <p>编辑库存记录p>
    97. <table id="fruit_add_tbl">
    98. <tr>
    99. <th class="w30">名称:th>
    100. <td><input type="text" id="fname"/>td>
    101. tr>
    102. <tr>
    103. <th>单价:th>
    104. <td><input type="text" id="price"/>td>
    105. tr>
    106. <tr>
    107. <th>数量:th>
    108. <td><input type="text" id="fcount"/>td>
    109. tr>
    110. <tr>
    111. <th colspan="2">
    112. <input type="button" value="确定"/>
    113. <input type="reset" value="重填"/>
    114. th>
    115. tr>
    116. table>
    117. div>
    118. div>
    119. body>
    120. html>

    2、fruit.css

    1. *{
    2. color:rgb(3, 31, 2);
    3. font-weight: lighter;
    4. }
    5. body{
    6. padding:0;
    7. margin:0;
    8. background-color: rgb(3, 31, 2);
    9. }
    10. #div0{
    11. width:80%;
    12. border:0px solid red;
    13. background-color: rgb(209, 230, 235);
    14. margin-left:10%;
    15. padding-top:48px;
    16. padding-bottom:48px;
    17. margin-top:8px;
    18. }
    19. #div_title{
    20. width:80%;
    21. margin-left:10%;
    22. text-align: center;
    23. font-size:24px;
    24. letter-spacing: 4px;
    25. margin-bottom:16px;
    26. }
    27. #div2{
    28. margin-left:10%;
    29. border:0px solid red;
    30. width:80%;
    31. }
    32. .delBtn{
    33. width:16px;
    34. height:16px;
    35. }
    36. #fruit_tbl , #fruit_tbl td, #fruit_tbl th {
    37. border:1px solid lightgray;
    38. text-align: center;
    39. }
    40. #fruit_tbl{
    41. width:100%;
    42. line-height: 32px;
    43. border-collapse: collapse;
    44. }
    45. .w10{
    46. width:10%;
    47. }
    48. .w15{
    49. width:15%;
    50. }
    51. .w20{
    52. width:20%;
    53. }
    54. .w30 {
    55. width: 30%;
    56. }
    57. #div3{
    58. margin-left:20%;
    59. border:1px solid lightgray;
    60. width:60%;
    61. margin-top: 16px;
    62. padding-bottom: 16px;
    63. }
    64. #fruit_add_tbl {
    65. width: 40%;
    66. margin-left: 30%;
    67. border: 1px solid lightgray;
    68. border-collapse: collapse;
    69. }
    70. #fruit_add_tbl th,#fruit_add_tbl td {
    71. border: 1px solid lightgrey;
    72. padding: 4px;
    73. }
    74. #div3 p {
    75. text-align: center;
    76. letter-spacing: 4px;
    77. }
    78. #fruit_add_tbl input[type="button"],#fruit_add_tbl input[type="reset"] {
    79. width: 100px;
    80. height: 28px;
    81. border: 1px solid lightgray;
    82. }
    83. #fruit_add_tbl input[type="text"] {
    84. border: 1px solid lightgray;
    85. height: 22px;
    86. }

    3、fruit.js

    1. function $(name) {
    2. if (name) {
    3. //假设name是 #fruit_tbl
    4. if (name.startsWith("#")) {
    5. name = name.substring(1); //fruit_tbl
    6. return document.getElementById(name);
    7. } else {
    8. return document.getElementsByName(name); //返回的是NodeList类型
    9. }
    10. }
    11. }
    12. //当页面加载完成后执行后面的匿名函数
    13. window.onload = function () {
    14. //get:获取 Element:元素 By:通过...方式
    15. //getElementById()根据id值获
    16. let fruitTbl = $("#fruit_tbl");
    17. //table.rows:获取这个表格的所有的行,返回数组
    18. let rows = fruitTbl.rows;
    19. //从 1 开始,因为 第 0 行是表头,不需要绑定事件
    20. for (let i = 1; i < rows.length - 1; i++) {
    21. let tr = rows[i];
    22. //事件动态绑定
    23. tr.onmouseover = showBGColor;
    24. tr.onmouseout = clearBGColor;
    25. //cell:单元格、细胞
    26. //获取这一行的所有的单元格
    27. let tds = tr.cells;
    28. let priceTD = tds[2];
    29. //绑定鼠标悬浮事件
    30. priceTD.onmouseover = showHand;
    31. //绑定点击事件
    32. priceTD.onclick = editPrice
    33. //给删除小图标绑定鼠标悬浮和点击事件
    34. let delImgTd = tds[5];
    35. let delImg = delImgTd.firstChild;
    36. delImg.onmouseover = showHand;
    37. delImg.onclick = delFruit;
    38. }
    39. zj();
    40. //获取全选这个复选框
    41. let ckAll = $("#ckAll");
    42. ckAll.onchange = myCkAll;
    43. //获取所有的普通复选框
    44. let ckArr = $("ck");
    45. ckArr.forEach((item, index) => {
    46. item.onchange = myCk;
    47. });
    48. //给批量删除按钮绑定点击事件
    49. const delsBtn = $("#delsBtn");
    50. delsBtn.onclick = delFruits;
    51. };
    52. delFruits = function () {
    53. if (confirm("是否确认批量删除?")) {
    54. let fruitTbl = $("#fruit_tbl");
    55. let rows = fruitTbl.rows;
    56. let ckArr = $("ck");
    57. // for (let i = rows.length - 3; i >= 0; i--) {
    58. // if (ckArr[i].checked) {
    59. // fruitTbl.deleteRow(i + 1);
    60. // }
    61. // }
    62. for (let i = rows.length - 3; i >= 0; i--) {
    63. if (ckArr[i].checked) {
    64. let rowIndex = ckArr[i].parentElement.parentElement.rowIndex;
    65. fruitTbl.deleteRow(rowIndex);
    66. }
    67. }
    68. zj();
    69. }
    70. };
    71. myCk = function () {
    72. let ck = event.srcElement;
    73. if (!ck.checked) { //说明是取消选中,则全选这个复选框一定是不选中的
    74. $("#ckAll").checked = false;
    75. } else {
    76. let ckArr = $("ck");
    77. //NodeList 转化成 Array 的三种解决方法:
    78. // 1、
    79. //let ckArr2 = Array.prototype.slice.call(ckArr);
    80. //$("#ckAll").checked = ckArr2.every(item => item.checked);
    81. //2、
    82. //$("#ckAll").checked = [...ckArr].every(item => item.checked);
    83. //3、
    84. let ckArr2 = Array.from(ckArr);
    85. $("#ckAll").checked = ckArr2.every(item => item.checked);
    86. //4、直接使用for循环,遍历NodeList
    87. // let flag = true;
    88. // for (let i = 0; i < ckArr.length; i++) {
    89. // if (!ckArr[i].checked) {
    90. // flag = false;
    91. // break;
    92. // }
    93. // }
    94. // $("#ckAll").checked = flag;
    95. }
    96. };
    97. myCkAll = function () {
    98. let ckAll = $("#ckAll");
    99. let flag = ckAll.checked;
    100. //debugger
    101. let ckArr = $("ck");
    102. for (let i = 0; i < ckArr.length; i++) {
    103. ckArr[i].checked = flag;
    104. }
    105. };
    106. delFruit = function () {
    107. if (window.confirm("是否删除?")) {
    108. let fruitTbl = $("#fruit_tbl");
    109. let delImg = event.srcElement;
    110. if (delImg && delImg.tagName == "IMG") {
    111. let tr = delImg.parentElement.parentElement;
    112. //tr.rowIndex获取当前tr这一行的行索引
    113. let rowIndex = tr.rowIndex;
    114. //table对象有一个方法:deleteRow,能够删除指定索引位置的行
    115. fruitTbl.deleteRow(rowIndex);
    116. //重新计算总计
    117. zj();
    118. }
    119. }
    120. };
    121. editPrice = function () {
    122. let priceTD = event.srcElement;
    123. //inner:在...内部
    124. let oldPrice = priceTD.innerText;
    125. //innerHTML:在节点内部填充一段HTML代码
    126. //priceTD.innerHTML = "";
    127. priceTD.innerHTML = "";
    128. /**
    129. *
    130. * first:第一个 child:孩子
    131. * firstChild:第一个子节点
    132. * @type {ActiveX.IXMLDOMNode | ChildNode | (() => (Node | null))}
    133. */
    134. let priceInput = priceTD.firstChild;
    135. priceInput.value = oldPrice;
    136. priceInput.select();
    137. //绑定失去焦点事件
    138. priceInput.onblur = updatePrice;
    139. //输入框绑定键盘摁下事件,用于判断摁下的值是否合法
    140. priceInput.onkeydown = ckInput;
    141. };
    142. ckInput = function () {
    143. // 0-9:48-57 backspace:8 enter:13
    144. let kc = event.keyCode;
    145. if (!((kc >= 48 && kc <= 57) || kc == 8 || kc == 13)) {
    146. //取消事件
    147. event.returnValue = false;
    148. }
    149. if (kc == 13) {
    150. event.srcElement.blur();
    151. }
    152. };
    153. updatePrice = function () {
    154. let priceInput = event.srcElement;
    155. let newPrice = priceInput.value;
    156. let priceTD = priceInput.parentElement;
    157. priceTD.innerText = newPrice;
    158. xj(priceTD.parentElement)
    159. };
    160. xj = function (tr) {
    161. if (tr && tr.tagName == "TR") {
    162. let tds = tr.cells;
    163. let priceTD = tds[2];
    164. let fcountTD = tds[3];
    165. let xjTD = tds[4];
    166. let price = parseInt(priceTD.innerText);
    167. let fcount = parseInt(fcountTD.innerText);
    168. let xj = price * fcount;
    169. xjTD.innerText = xj;
    170. //同时更新总计
    171. zj();
    172. }
    173. };
    174. zj = function () {
    175. let fruitTbl = $("#fruit_tbl");
    176. let rows = fruitTbl.rows;
    177. let total = 0;
    178. for (let i = 1; i < rows.length - 1; i++) {
    179. let tr = rows[i];
    180. let xj = parseInt(tr.cells[4].innerText);
    181. total += xj;
    182. }
    183. rows[rows.length - 1].cells[1].innerText = total;
    184. };
    185. function showHand() {
    186. let priceTD = event.srcElement;
    187. //cursor光标
    188. priceTD.style.cursor = "pointer";
    189. }
    190. function showBGColor() {
    191. //window.event表示当前发生的事件 ”window.“可以省略
    192. // console.log(window.event);
    193. // alert(window.event);
    194. let obj = window.event.srcElement;
    195. //alert(obj);
    196. //console.log(obj); //发现obj是td,而不是tr。事件传递现象
    197. if (obj.tagName == "TD") {
    198. let td = obj;
    199. //parentElement:父元素 td的父元素是tr。tr有很多td子元素
    200. let tr = td.parentElement;
    201. tr.style.backgroundColor = "purple";
    202. //获取当前所有单元格,然后设置单元格中字体的颜色
    203. let tds = tr.cells;
    204. for (let i = 0; i < tds.length; i++) {
    205. tds[i].style.color = "white";
    206. }
    207. }
    208. }
    209. function clearBGColor() {
    210. let td = window.event.srcElement;
    211. if (td.tagName == "TD") {
    212. let tr = td.parentElement;
    213. tr.style.backgroundColor = "transparent";
    214. //获取当前行所有单元格,然后设置单元格中字体的颜色
    215. let tds = tr.cells;
    216. for (let i = 0; i < tds.length; i++) {
    217. tds[i].style.color = "#031f02";
    218. }
    219. }
    220. }

  • 相关阅读:
    C++特殊类设计
    【关于ensp的bug】关于网传mac地址颠倒学习的现象
    RocketMQ(17)——Broker可配置参数
    Android IPC | Android多进程模式
    【开发工具】vConsole - 手机前端开发调试利器
    Flink学习7:应用程序结构
    手把手教你使用云产品实现抖音同款微信早安推送(腾讯云Python版本)
    Leetcode P640
    在线系统运行慢,对其进行性能分析以及处置的方法【总结】
    linux下nvme各文件的含义
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134447575