3-1 编程挑战
本节编程练习不计算学习进度,请电脑登录imooc.com操作

编程挑战

小伙伴们,根据所学知识,使用JS实现案例中的购物车功能。

效果图:

 

任务要求:

一、扩展document.getElementsByClassName方法。

提示:
1. 判断是否存在document.getElementsByClassName
2. 如果不存在,使用document.getElementsByTagName('*')结合className来模拟

二、定义计算函数getTotal,计算总价格,数目,并更新已选弹层的HTML。

提示:
   1. 遍历每一行,判断是否已选。
   2.如果已选,分别累加总数,价格,弹层的HTML。
   3. 更新累加结果。

注意:如果没有勾选行的时候, 弹层的状态。

三、定义小计价格函数getSubTotal。

提示:
   1.接受一个参数tr,为要计算的行。
   2.取得数目输入框的值,乘单价。
   3. 结果写入小计的单元格。

四、绑定每一行勾选框事件。

提示:
   1.遍历每一行,取得勾选框,添加click事件。
   2. 判断是否为全选框,如果是,更新所有勾选框。
   3. 如果有一个未选择,全选框checked为false。

五、绑定已选按钮事件,用于显示或者隐藏浮层。

提示:
   1. 根据foot.className来相应变化,实现隐藏和显示。
   2. 如果已选项为0,则不显示。
六、在已选弹层上事件代理,用于删除已选。
提示:
   1.根据目标元素的class来判断是否点击了取消选择。
   2.取得代表行索引的自定义属性index。
   3. 把相应的勾选框去掉勾选。
   4.手动触发勾选框的click事件

注意:勾选框事件的手动触发。

七、遍历每一行,绑定事件。

1)在tr上绑定点击事件代理

提示:
   1.获取触发元素,取得class。
   2.如果class为add, 增加数目,并计算小计价格。
   3.如果class为reduce, 减少数目,并计算小计价格。
   4.如果class为delete,删除相应的行。
   5. 调用计算总数函数getTotal。
注意:IE下event对象存在window下

2)绑定数量输入框事件,实时更新小计价格

提示:
   1.绑定keyup事件。
   2.如果输入框的值不是数字或者小于1,重置为1。
   3.根据输入框的值,更新减号的显示和隐藏。

八、默认勾选所有商品。

提示:
   1.更改全选框的checked为true。
   2.触发全选框的click事件。

 

任务

任务要求在上方:

素材地址:

http://img1.sycdn.imooc.com//53b4c12b0001b0a702200220.jpg

http://img1.sycdn.imooc.com//53b4c149000144b202200220.jpg

http://img1.sycdn.imooc.com//53b4c16000011dfd02200220.jpg

 

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>购物车</title>
  6. <link rel="stylesheet" href="css/style.css"/>
  7. <script type="text/javascript">
  8. window.onload = function () {
  9. var cartTable = document.getElementById('cartTable');
  10. var tr = cartTable.children[1].rows;
  11. var checkInputs = document.getElementsByClassName('check');
  12. var checkAllInputs = document.getElementsByClassName('check-all');
  13. var selectedTotal = document.getElementById('selectedTotal');
  14. var priceTotal = document.getElementById('priceTotal');
  15. var selected = document.getElementById('selected');
  16. var foot = document.getElementById('foot');
  17. var selectedViewList = document.getElementById('selectedViewList');
  18. var deleteAll = document.getElementById('deleteAll');
  19.  
  20. // 扩展document.getElementsByClassName方法
  21.  
  22.  
  23.  
  24.  
  25. //计算函数getTotal,计算总价格,数目,并更新已选弹层的HTML
  26.  
  27.  
  28.  
  29.  
  30. //小计价格函数getSubTotal
  31.  
  32.  
  33.  
  34.  
  35.  
  36. //绑定勾选框事件
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. //绑定已选按钮事件,用于显示或者隐藏浮层
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. //在已选弹层上事件代理,用于删除已选
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. for (var i = 0; i < tr.length; i++) {
  58.  
  59. //表格每一行上事件代理
  60.  
  61.  
  62.  
  63.  
  64.  
  65. //绑定数量输入框事件,实时更新小计价格
  66.  
  67.  
  68.  
  69.  
  70. }
  71.  
  72. // 绑定删除按钮事件, 删除已选项
  73.  
  74.  
  75.  
  76.  
  77.  
  78. // 默认选择所有商品
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. }
  87. </script>
  88. </head>
  89. <body>
  90. <table id="cartTable">
  91. <thead>
  92. <tr>
  93. <th><label><input class="check-all check" type="checkbox"/>&nbsp;全选</label></th>
  94. <th>商品</th>
  95. <th>单价</th>
  96. <th>数量</th>
  97. <th>小计</th>
  98. <th>操作</th>
  99. </tr>
  100. </thead>
  101. <tbody>
  102. <tr>
  103. <td class="checkbox"><input class="check-one check" type="checkbox"/></td>
  104. <td class="goods"><img src="http://img1.sycdn.imooc.com//53b4c0d900013fbf02200220.jpg" alt=""/><span>Casio/卡西欧 EX-TR350</span></td>
  105. <td class="price">5999.88</td>
  106. <td class="count">
  107. <span class="reduce"></span>
  108. <input class="count-input" type="text" value="1"/>
  109. <span class="add">+</span></td>
  110. <td class="subtotal">5999.88</td>
  111. <td class="operation"><span class="delete">删除</span></td>
  112. </tr>
  113. <tr>
  114. <td class="checkbox"><input class="check-one check" type="checkbox"/></td>
  115. <td class="goods"><img src="http://img1.sycdn.imooc.com//53b4c0f60001b4ee02200147.jpg" alt=""/><span>Canon/佳能 PowerShot SX50 HS</span></td>
  116. <td class="price">3888.50</td>
  117. <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
  118. <td class="subtotal">3888.50</td>
  119. <td class="operation"><span class="delete">删除</span></td>
  120. </tr>
  121. <tr>
  122. <td class="checkbox"><input class="check-one check" type="checkbox"/></td>
  123. <td class="goods"><img src="http://img1.sycdn.imooc.com//53b4c10b0001551b02200165.jpg" alt=""/><span>Sony/索尼 DSC-WX300</span></td>
  124. <td class="price">1428.50</td>
  125. <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
  126. <td class="subtotal">1428.50</td>
  127. <td class="operation"><span class="delete">删除</span></td>
  128. </tr>
  129. <tr>
  130. <td class="checkbox"><input class="check-one check" type="checkbox"/></td>
  131. <td class="goods"><img src="http://img1.sycdn.imooc.com//53b4c11b0001b00f02200220.jpg" alt=""/><span>Fujifilm/富士 instax mini 25</span></td>
  132. <td class="price">640.60</td>
  133. <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
  134. <td class="subtotal">640.60</td>
  135. <td class="operation"><span class="delete">删除</span></td>
  136. </tr>
  137. </tbody>
  138. </table>
  139.  
  140. <div class="foot" id="foot">
  141. <label class="fl select-all"><input type="checkbox" class="check-all check"/>&nbsp;全选</label>
  142. <a class="fl delete" id="deleteAll" href="javascript:;">删除</a>
  143. <div class="fr closing">结 算</div>
  144. <div class="fr total">合计:¥<span id="priceTotal">0.00</span></div>
  145. <div class="fr selected" id="selected">已选商品
  146. <span id="selectedTotal">0</span>
  147. <span class="arrow up"></span>
  148. <span class="arrow down"></span>
  149. </div>
  150. <div class="selected-view">
  151. <div id="selectedViewList" class="clearfix">
  152. <!--<div><img src="images/1.jpg"><span>取消选择</span></div>-->
  153. </div>
  154. <span class="arrow"><span></span></span>
  155. </div>
  156. </div>
  157. </body>
  158. </html>
返回课程