购物车

在我们写购物车的时候一定要捋清思路,在写之前一定要把自己的HTML的结构搞清楚;
下面是我自己写的购物车:
我在HTML的代码为:

<div class="height">
    <div class="nav">
        <p><span>特卖商品 19:46</span>|<span>唯品医药</span></p>
    </div>
    <div class="tittle">
        <p><span>配送至北京市</span>|<span>请在倒计时结束前提交订单,下班后你另有30分钟的支付时间</span></p>
    </div>
    <div class="shangpin">
        <ul>
            <li>精选特卖</li>
            <li>单价</li>
            <li>数量</li>
            <li>小计</li>
            <li>操作</li>
        </ul>
        <div class="img">
            <!-- <input type="checkbox" name="" id="">
            <img src="../img/1.png" alt="">
            <p><span>自营|</span>【棉100%】红豆集团旗下海魂衫柔软亲肤全面男士短袖polo</p>
            <p>尺码:XL</p>
            <b>¥128</b>
            <button>-</button>
            <input type="text">
            <button>+</button>
            <p>¥128</p>
            <p>删除</p> -->
        </div>
    </div>
    <div class="tll">
        <input type="checkbox" name="" id="" class="quan">全选
        <p>共<span class="sp"></span>商品 商品金额 <span class="all">¥</span></p>
        <p>总金额(未含运费)<span class="all_2">¥</span></p>
        <div class="foot">
            <p>总金额<span class="all_3"></span></p>
            <button>立即结算</button>
        </div>
    </div>
</div>
<script src="../js/唯品会.js"></script>

页面的显示效果为:


image.png

然后就剩下js中的操作;
首先我们要把后台的数据渲染进去;

var arr = document.getElementsByClassName(`img`)[0];
var str = ``;
for (var i in data) {
    str += `
    <div class="img">
    <input type="checkbox" name="" id="" ${data[i].isChecked ? `checked` : ``}>
    <img src="../img/${data[i].img}" alt="">
    <p><span>自营|</span>${data[i].name}</p>
    <p>尺码:XL</p>
    <b>¥${data[i].sum}</b>
    <button class="left">-</button>
    <input type="text" value="${data[i].num}" class="text">
    <button class="right">+</button>
    <p class="zong">¥${data[i].yuan_price}</p>
    <p class="shan">删除</p>
</div>`
}
arr.innerHTML = str;

第二步就是获取到我们所需要的节点;切记在获取节点的时候我们要保证获取的准确无误;最好在自己不确定或者没有把握的时候console.log一下,检查自己获取成功没有;
代码为:

var left = document.getElementsByClassName(`left`);
var right = document.getElementsByClassName(`right`);
var int = document.querySelectorAll(`.img input[type=text]`);
var zong = document.getElementsByClassName(`zong`);
var quan = document.getElementsByClassName(`quan`)[0];
var inpc = document.querySelectorAll(`.img input[type=checkbox]`);
var sp = document.getElementsByClassName(`sp`)[0];
var all = document.getElementsByClassName(`all`)[0];
var all_2 = document.getElementsByClassName(`all_2`)[0];
var all_3 = document.getElementsByClassName(`all_3`)[0];
var shan = document.getElementsByClassName(`shan`);

上面的呢就是我们所需要的节点;
现在开启我们的大脑,我的思路呢是先把加号和减号按钮做出来还有input的vlaue的值;
恩,现在我们先想的是当vlaue等于一的时候是否还能使用减号,
那我们就先禁用减号的使用:*disabled:能够禁用button;
其代码为:

for (var j in data) {
    if (data[j].num <= 1) {
        left[j].disabled = true;
    }
}

然后我们先做加号,首先我们要想当我们点击了一下加号之后我们应该把减号启用;
所以:

for (var i = 0; i < data.length; i++) {
    right[i].index = i;
    var nums = 0;
    right[i].onclick = function () {
        left[this.index].disabled = false;//解除减号的封用
        nums = data[this.index].num;
        nums++;
        int[this.index].value = nums;
        data[this.index].num = nums;
        var sums = nums * data[this.index].yuan_price;
        zong[this.index].innerHTML = sums;
        data[this.index].sum = sums;
    }
}

点击减号的代码:当点击加号时我们把减号解除了禁用,但我们考虑到还有使vlaue值为1的时候,所以我们这里还要把它禁用一次;

for (var i = 0; i < data.length; i++) {
    left[i].index = i;
    var nums = 0;
    left[i].onclick = function () {

        nums = data[this.index].num;
        nums--;
        if (nums <= 1) {
            left[this.index].disabled = true;//这一步也是禁用减号,使其不能点击;
        }
        int[this.index].value = nums;
        data[this.index].num = nums;
        var sums = nums * data[this.index].yuan_price;
        zong[this.index].innerHTML = sums;
        data[this.index].sum = sums;
    }
}

然后我们就需要考虑到全选和单选了;
全选的代码:

quan.onclick = function () {
    var is_Checked = quan.checked;
    for (var k = 0; k < inpc.length; k++) {
        inpc[k].checked = is_Checked;
        data[k].isChecked = is_Checked;
    }
}

在这里我新建了一个变量使其等于全选的选中的状态;
用for循环来使每一个单选的在选中状态等于全选的状态;在传回后台数据;
单选的代码:

for (var i = 0; i < inpc.length; i++) {
    inpc[i].index = i;//获取下标
    inpc[i].onclick = function () {
        var val = inpc[this.index].checked;
        data[this.index].isChecked = val;
        var pop = data.every(function (item) {
            return item.isChecked;
        })
        quan.checked = pop
    }
}

这里用到了迭代函数every()具体的使用方法在我上一遍件数中已经有了解答;就是当每一个单选框的选中状态为true时全选也为true;

下面我们要封装一个函数,使我们排版下面的商品数量和商品金额跟随我们的心意同步;

代码为:

function getSum() {
    var brr = 0, crr = 0;
    for (var i = 0; i < data.length; i++) {
        if (data[i].isChecked == true) {
            brr += data[i].num;
            crr += data[i].sum;
        }
    }
    sp.innerHTML = brr;
    all.innerHTML = crr;
    all_2.innerHTML = crr;
    all_3.innerHTML = crr;
}
getSum();

我们需要把这个函数一一引用到加减点击和单选、全选中去;这里就不展示代码图了,只是一个调用;

最后我们要做删除的点击:
首先也是必不可少的for循环,能够作用到每一个删除上;

for (var i = 0; i < shan.length; i++) {
    shan[i].index = i;
    shan[i].onclick = function () {
        var node = this.parentNode;
        console.log(node)
        node.parentNode.removeChild(node);
        data.splice(this.index, 1);
        getSum();
        xuanRan();
        if(data.length == 0){
            quan.checked = false;
        }
    }
}

恩,这里我单独介绍一下我声明的这一个变量node;this.parentNode:指的是我们删除的父节点也就是我们所需要删除的全部元素;我用现在获取到父节点然后再用删除的父节点的父节点(ps:我这里是因为引用数据的缘故;有不同的请参考自己的排版样式;)来删除父节点;
data.splice:是将后台的数据也给同步删除;
下面的if判断是当后台数据没有时,也是我们将购物车里面的商品全选之后删除使全选处于没选中状态;
接下来就是封装渲染的数据和函数;然胡互相调用;切记数据的封装要先在上方调用一下;

最后的最后我们打开浏览器就可以看到一个购物车已经成型了!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339