图书销售系统项目知识点总结

1、实现购物车

问题1:点击物品的加减,需要给当前物品的数目变化;因为物品列表是动态增加的,每次点击增加,数目会增加,但是点击下一物品,还是这个物品的数目增加,最后用了一个本办法

给当前元素span一个唯一的ID,通过i来获取

 div1.innerHTML = '<input  type="button" value="-" onClick="less('+i+')"><span id="count'+i+'">1</span><input type="button" value="+" onClick="add('+i+')">';

 以增加函数为例:

function add(i) {
    var count = document.getElementById('count'+i);
    var num = parseInt(count.innerHTML);
    if (num >= 100) return;
    num++;
    count.innerHTML = num;
}

问题2:首先购物车上面的小徽标不显示,当点击加入购物车时,小徽标显示;

li.pos{
    position: relative;
}
#dot{
    display: none;
    position: absolute;
    top:2;
    left:2;
}

这是实现小徽标相对于购物车定位。

当点击加入购物车时,js操作让小徽标显示

 $("#dot")[0].style.display="block";

但是这个使小徽标显示在购物车下面,position:aboslute的top和left属性都不生效;最后发现block会另起一行,所以而且span本来就是行内元素,最后修改为inline-block

 $("#dot")[0].style.display="inline-block";

则布局正常:

问题3:实现每次点击加入购物车,都会把所有点击加入购物车的数目都计算进去,所以要保存前一次的,设置一个变量total

但是会出现新的问题,比如物品A:数目为2,加入购物车,下次数目为3,继续加入购物车,这时总数目为5,需要修改;

function shop(i, id) {
    var total = 0;
    //加入购物车的时候 需要当前bookId,数目
    var count = parseInt(document.getElementById('count' + i).innerHTML);
    var product = {
        "bookId": id,
        "count": count
    };
    var isExsit = products.some((item) => {
        return item.bookId == product.bookId
    })
    if (products.length < 1 || !isExsit) {
        products.push(product);
    } else {
        products.forEach((item) => {
            if (item.bookId == product.bookId) {
                item.count = product.count;
                return;
            }
        })
    }
    if (count !== 0) {
        $.ajax({
            url: "http://test/mock.com/bookStore/shop",
            type: 'post',
            dataType: 'json',
            data: products,
            success: function (data) {
                if (data.code == "1") {
                    products.forEach((item) => {
                        total += parseInt(item.count);
                    })
                    $("#dot")[0].style.display = "inline-block";
                    $("#dot")[0].innerHTML = total;
                }
            }
        })
    }
}

2、动态生成的元素添加事件带参数时,直接执行了咋办

wraps.setAttribute("id",list[i].id);
wraps.addEventListener("click",showDetail);

showDetail函数不加括号,就不会自动执行;但是要带参数的时候也不能直接带了,这里先给id属性,之后通过this.id来取到属性值;

3、本次项目实行前后端分离,数据接口是用mock来生成的

(1)如何mock一个前端get请求,?后面带参数的请求---》需要用到正则

Mock.mock(RegExp('http://test/mock.com/bookStore/bookDetail'+ ".*"), 'get', (options) => {
    // 这里的options.body类型为字符串,传入的时候要转化一下,将其转成json格式
    var data = Mock.mock({
        'code': "1"
    })
    return data
});

(2)mock数据产生随机的两位数

var data = Mock.mock({
        // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
        'list|1-10': [{
            // 属性 id 是一个自增数,起始值为 1,每次增 1
            'id|+1': 1,
            'bookName': "@name",
            'AuthorName': "AAA",
            'ISBN': 1234,
            'genre': "story",
            'price|10-100':5
        }]
    })

4、点击加入购物车函数会冒泡到最外层,点击zhen整个item,然后跳转页面,做一个阻止事件冒泡

 this.event.stopPropagation(); 

适用于当前函数带参数;不是自带e,否则就直接e.stopPropagation

5、实现添加进购物车的数据保存在浏览器缓存里面,最后展示购物车信息

添加购物车操作的代码如下:

function shop(i, id) {
   // id是当前加入购物车产品的id,i是用来计数,看加入购物车的产品总数
    this.event.stopPropagation();
    var total = 0;
    //加入购物车的时候 需要当前bookId,数目
    var count = parseInt(document.getElementById('count' + i).innerHTML);
    var product = {
        "bookId": id,
        "count": count
    };
    var isExsit = products.some((item) => {
        return item.bookId == product.bookId
    })
    if (products.length < 1 || !isExsit) {
        products.push(product);
    } else {
        products.forEach((item) => {
            if (item.bookId == product.bookId) {
                item.count = product.count;
                return;
            }
        })
    }
    saveData(JSON.stringify(products));
    products.forEach((item) => {
        total += parseInt(item.count);
    })
    if (total !== 0) {
        $("#dot")[0].style.display = "inline-block";
        $("#dot")[0].innerHTML = total;
    } else {
        $("#dot")[0].style.display = "none";
    }
}

上述saveData(),就是用来给浏览器缓存里面存数据的。localStorage不能直接存入对象或者数组,所以先转换为i字符串

function saveData(data) {
    var listData = localStorage.getItem("shopProducts");
    if (listData) {
        localStorage.setItem("shopProducts", data);
    }
}

6、需要mock一个日期,语法如下:

  'date': '@DATETIME("yyyy-MM-dd HH:mm:ss")'

7、书的库存必须是每次添加10本以上,设计一个input框

oninput事件是在输入框中输入时就会触发

onchange事件是在输入框输入完内容后,输入框失焦后触发

onchange事件兼容性好,主流浏览器都支持

oninput事件IE9以下不支持,其余主流浏览器都支持,针对IE9以下的可以使用onpropertychange事件来替代

问题是input框添加了min属性为10,但是还可以在框内手动输入,并且输入的值可以是字母也可以是小于10的,因此需要额外添加事件来监控。

本次选用onchange事件来实现

preDeal()函数代码如下:

function preDeal(){
    var e =e || window.event;
    var reg=/[^\d]/g;
    if(reg.test(e.target.value)  || e.target.value < 10){
        e.target.value = e.target.value.replace(e.target.value,'');
    }
}

 首先用e.target.event来取到用户填的值,如果值小于10或者为非数组,则替换当前值为空字符串。

在尝试问题中间,发现只有e.target.value<10也可以过滤字母输入,浏览器控制台“e”<10是true

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>