原生js模拟淘宝购物车项目实战

本文实例讲述了原生js模拟淘宝购物车实现代码。分享给大家供大家参考。具体如下:

通过JavaScript实现类似与淘宝的购物车效果,包括商品的单选、全选、删除、修改数量、价格计算、数目计算、预览等功能的实现。实现的效果图:

相应的代码:

shoppingCart.html

<!DOCTYPE html>

<html>

<head>

<meta charset = "UTF-8">

<title>JavaScript实现购物车项目实战</title>

<link rel="stylesheet" type="text/css" href="./css/shoppingCart.css">

<script type="text/javascript" src="./js/shoppingCart.js"></script>

</head>

<body>

<table id="cartTable">

<thead>

<tr class="order_content">

<th><input class="check_all check" type="checkbox"></input>&nbsp;全选</th>

<th>商品</th>

<th>单价</th>

<th>数量</th>

<th>小计</th>

<th>操作</th>

</tr>

</thead>

<tbody>

<tr class="order_content">

<td class="check"><input class = "check_one check" type="checkbox"></input></td>

<td class="goods"><img src="./imgs/apple6s.png"><span>Iphone 6S</span></td>

<td class="price">5099.88</td>

<td class="count">

<span class="reduce">-</span>

<input class="count_input" type="text" value="1"></input>

<span class="add">+</span>

</td>

<td class="subtotle">5099.88</td>

<td class="operation"><span class="delete">删除<span></td>

</tr>

<tr class="order_content">

<td class="check"><input class = "check_one check" type="checkbox"></input></td>

<td class="goods"><img src="./imgs/macbook.png"><span>MacBook Air</span></td>

<td class="price">1099.99</td>

<td class="count">

<span class="reduce">-</span>

<input class="count_input" type="text" value="1"></input>

<span class="add">+</span>

</td>

<td class="subtotle">1099.99</td>

<td class="operation"><span class="delete">删除<span></td>

</tr>

<tr class="order_content">

<td class="check"><input class = "check_one check" type="checkbox"></input></td>

<td class="goods"><img src="./imgs/ipadmini.png"><span>Ipad mini2 银16g WLAN7.9英寸</span></td>

<td class="price">6599.00</td>

<td class="count">

<span class="reduce">-</span>

<input class="count_input" type="text" value="1"></input>

<span class="add">+</span>

</td>

<td class="subtotle">6599.00</td>

<td class="operation"><span class="delete">删除<span></td>

</tr>

<tr>

<td class="check"><input class = "check_one check" type="checkbox"></input></td>

<td class="goods"><img src="./imgs/applewatch.png"><span>IWatch EXTS Min</span></td>

<td class="price">9998.68</td>

<td class="count">

<span class="reduce">-</span>

<input class="count_input" type="text" value="1"></input>

<span class="add">+</span>

</td>

<td class="subtotle">9998.68</td>

<td class="operation"><span class="delete">删除<span></td>

</tr>

</tbody>

</table>

<div class="slected view">

<div id="selectedViewList" class="clearfix">

<!-- <div><img src="./imgs/applewatch.png"><span>取消选择</span></div> -->

</div>

<span class="arrow">.<span>.</span></span>

</div>

<div id = "footer" class="footer">

<label class="fl select_all" ><input class="check_all check" type="checkbox">&nbsp;全选</input></label>

<a class="fl delete_all" id="deleteAll" href="javascript:;">删除</a>

<div class="fr closing">结算</div>

<div class="fr selected_totle">合计:¥ <span id="priceTotle">0.00</span> </div>

<div class="fr selectAll" id="selected">已购商品

<span id = "selectTotle">0</span>件

<span class="arow up">+++</span>

<span class="arow down">---</span>

</div>

</div>

</body>

</html>

shoppingCart.js

window.onload = function(){

//低版本的IE浏览器不支持getElementByClassName方法,考虑兼容性,重写方法。

if (!document.getElementByClassName) {

document.getElementByClassName =function(cls){

var ret = [];

var clsElments = document.getElementsByTagName('*');

for (var i = 0, len = clsElments.length; i < len; i++) {

//考虑一个标签有多个class的情况,这里用正则表达式会好一点

if (clsElments[i].className == cls

|| (clsElments[i].className.indexOf(cls + " ") >= 0)

|| (clsElments[i].className.indexOf(" " + cls + " ") >= 0)

|| (clsElments[i].className.indexOf(" " + cls) >= 0))

{

ret.push(clsElments[i]);

}

}

return ret;

}

}

var cartTable = document.getElementById("cartTable");

var tr = cartTable.children[1].rows; //table标签特有的属性,rows可以获得表格元素的所有tr行。

var checkInput = document.getElementByClassName('check');//获得所有的单选框

var checkAllInput = document.getElementByClassName('check_all');//获得所有的单选框

var priceTotle = document.getElementById("priceTotle");//总价

var selectTotle = document.getElementById("selectTotle");//已选商品

var selected = document.getElementById("selected");

var footer = document.getElementById("footer");//底部标签

var selectedViewList = document.getElementById("selectedViewList");//底部标签

var deleteAll = document.getElementById("deleteAll");

//计算总价格和数量

function getTotle(){

var selectNum = 0;//数量

var priceNum = 0;//价格

var HTMLstr = ""; //缩略图的字符串拼接

for (var i = 0,len = tr.length; i < len; i++) {

if (tr[i].getElementsByTagName("input")[0].checked) {

tr[i].className ="on";

selectNum += parseInt(tr[i].getElementsByTagName("input")[1].value);

priceNum += parseFloat(tr[i].cells[4].innerHTML);

//拼接字符串显示已经选择的商品

HTMLstr += '<div><img src="'+ tr[i].getElementsByTagName('img')[0].src +'"><span class ="del" index ="'+ i +'">取消选择</span></div>';

}

else{

tr[i].className = "";

}

}

selectTotle.innerHTML = selectNum;

priceTotle.innerHTML = priceNum.toFixed(2);//保留两位小数

selectedViewList.innerHTML = HTMLstr;

}

//计算小计价格

function getSubTotle(tr){

var tds = tr.cells;

var price = parseFloat(tds[2].innerHTML);

var num = parseInt(tr.getElementsByTagName("input")[1].value);

var subTotle = parseFloat(price * num).toFixed(2);

tds[4].innerHTML = subTotle;

}

//复选框绑定单击事件

for (var i = 0, len = checkInput.length; i < len; i++){

checkInput[i].onclick =function (){

//判断全选按钮,变更

if (this.className == "check_all check") {

for (var j = 0; j < len; j++){

checkInput[j].checked = this.checked;

}

}

if (this.checked == false) {

for (var k = 0,len2 = checkAllInput.length; k < len2; k++){

checkAllInput[k].checked = false;

}

}

getTotle();

}

}

//控制底部标签的显示

selected.onclick = function(){

if (footer.className == "footer") {

footer.className == "footer show";

} else {

footer.className == "footer";

}

}

//图片缩略图的取消选择按钮功能,e为事件对象

selectedViewList.onclick = function(e){

//兼容低版本的IE

/* if (e){

e = e;

}else{

e = window.event;

} */

var e = e || window.event;

var el = e.srcElement;

if (el.className == "del") {

var index = el.getAttribute("index");

var input = tr[index].getElementsByTagName("input")[0];

input.checked = false;

input.onclick();

}

}

//实现加减、删除操作。同样用事件代理的方法实现

for (var i = 0, len3 = tr.length; i < len3; i++){

tr[i].onclick = function(e){

var e = e || window.event;

var el = e.srcElement;

var clsName = el.className;

var input = this.getElementsByTagName("input")[1];

var inputValue = parseInt(input.value);

var reduce = this.getElementsByTagName("span")[1];

switch (clsName){

case "add":

/*parseInt(inputValue) ++;*/

input.value = inputValue + 1;

reduce.innerHTML ="-";

getSubTotle(this);

break;

case "reduce":

if(inputValue >= 1){

input.value = inputValue - 1;

}else{

reduce.innerHTML ="";

}

getSubTotle(this);

break;

case "delete":

var conf = confirm("确定删除这个商品?");

if (conf) {

this.parentNode.removeChild(this);

}

break;

default:

break;

}

getTotle();

}

//处理从手动输入商品数量

tr[i].getElementsByTagName("input")[1].onkeyup = function(){

var val = this.value;

var tr = this.parentNode.parentNode;

if (isNaN(val) || val < 0 ) {

val = 1;

}

this.value = val;

getSubTotle(tr);

}

}

//全选删除

deleteAll.onclick = function(){

if (selectTotle.innerHTML !="0") {

var conf = confirm("确定删除这些商品?");

if (conf) {

for (var i = 0, len = tr.length; i < len; i++) {

var input = tr[i].getElementsByTagName("input")[0];

if(input.checked){

tr[i].parentNode.removeChild(tr[i]);

}

}

}

}

}

}

//取消选择--采用事件代理---放到父元素上。


shoppingCart.css

.count_input{

width: 39px;

height: 15px;

line-height: 15px;

border: 1px solid #aaa;

color: #343434;

text-align: center;

padding: 4px 0;

background-color: #fff;

}

span.add, span.reduce{

height: 23px;

width: 27px;

border: 1px solid #e5e5e5;

background: #f0f0f0;

line-height: 23px;

color: #444;

}

.closing{

display: inline-block;

width: 120px;

height: 50px;

line-height: 50px;

background: #f40;

text-align: center;

font-family: 'Microsoft Yahei';

font-size: 20px;

-webkit-border-radius: 2px;

-moz-border-radius: 2px;

-ms-border-radius: 2px;

border-radius: 2px;

text-decoration: none;

cursor: pointer;

}

.fr{

float: right;

}

.selected_totle, .selectAll, .select_all, .delete_all{

margin-top: 15px;

}

.footer{

height: 50px;

background: #e5e5e5;

font-family: 'Microsoft Yahei';

}

#selectTotle, #priceTotle,.subtotle {

color: #f40;

font-weight: 700;

font-size: 18px;

font-family: tohoma,arial;

padding: 5px;

}

以上是 原生js模拟淘宝购物车项目实战 的全部内容, 来源链接: utcz.com/z/352309.html

回到顶部