js实现购物车功能


Posted in Javascript onJune 12, 2018

本文实例为大家分享了js实现购物车功能的具体代码,供大家参考,具体内容如下

购物车实现3种方式

1、利用cookie

优点:不占用服务器资源,可以永远保存,不用考虑失效的问题
缺点: 对购买商品的数量是有限制的,存放数据的大小 不可以超过2k,用户如果禁用cookie那么就木有办法购买商品,卓越网实现了用户当用户禁用cookie,也可以购买。

2、利用 session

优点:用户禁用cookie,也可以购物
缺点:占用服务器资源,要考虑session失效的问题

3、利用数据库

优点:可以记录用户的购买行为,便于数据分析用户的喜好,推荐商品
缺点:给数据库造成太大的压力,如果数据量很大的话。

购物车需求分析

1、可以添加商品到购物车中

2、可以删除购物车中的商品

3、可以清空购物车

4、可以更新购物车的商品

5、可以结算

js代码

/**
 * Created by Administrator on 2017/9/3.
 */


/***
 * 购物车操作模块
 *
 */

//商品类
/***
 * @name item
 * @example
  item(sku, name, price, quantity)
 * @params {string} sku 商品的标示
 * @params {string} name 商品的名字
 * @param {number} price 商品的价格
 * @param {number} quantity 商品的数量
 */
function item(sku, name, price, quantity){
  this.sku = sku;
  this.name = name;
  this.price = price;
  this.quantity = quantity;
}

var shopCart = function(window){

  "use strict";
  //全局变量
  // note new new Date("2020-12-23") 在ie下面报错,不支持这样的语法
  var items = [],cartName='kuaidian_shop_cart',expires = new Date( new Date().getTime()+86400000*30 )
  ,debug = true,decimal = 2;
  var options = {
    'cartName' : cartName, //cookie的名字
    'expires' : expires, //cookie失效的时间
    'debug' : debug, //是否打印调试信息
    'decimal' : decimal, //钱的精确到小数点后的位数
    'callback' : undefined
  };


  //暴露给外部的接口方法
  return {
    inited : false,
    init: function(option){
      //判断用户是否禁用cookie
      if(!window.navigator.cookieEnabled ){
        alert('您的浏览器不支持cookie无法使用购物车!,请设置允许设置cookie。');
        return false;
      }
      //从cookie中获取购物车中的数据
      this.inited = true;
      if(option){
        extend(options,option);
      }
      var cookie = getCookie(options.cartName);
      if(typeof cookie === 'undefined'){
        setCookie(options.cartName,'',options.expires);
      }else{
        //每个item之间用&分开,item的属性之间用|分割
        var cookie = getCookie(options.cartName);
        if(cookie){
          var cItems = cookie.split('&');
          for(var i=0,l=cItems.length;i<l;i++){
            var cItem = cItems[i].split('|');
              var item = {};
              item.sku = cItem[0] || '';
              item.name = cItem[1] || '';
              item.price = cItem[2] || '';
              item.quantity = cItem[3] || '';
              items.push(item);
          };
        };

      };
    },
    findItem: function(sku){//根据sku标示查找商品
      //如果木有提供sku,则返回所有的item
      if(sku){
        for(var i=0,l=items.length;i<l;i++){
          var item = items[i];
          if(item.sku === sku){
            return item;
          }
        }
        return undefined;
      }else{
        return items;
      }

    },
    getItemIndex : function(sku){ //获取item在items的数组下标
      for(var i=0,l=items.length;i<l;i++){
        var item = items[i];
        if(item.sku == sku){
          return i;
        }
      }
      //木有找到返回-1
      return -1;
    },
    addItem: function(item){ //增加一个新商品到购物车
      //添加一个商品
      if(this.findItem(item.sku)){
        if(options.debug){
          _log('商品已经存在了');
          return false;
        }
      }
      items.push(item);
      _saveCookie();
      return true;
    },
    delItem: function(sku){ //从购物车中删除一个商品
      //删除一个商品
      var index = this.getItemIndex(sku);
      if(index > -1){
        items.splice(index,1);
        _saveCookie();
      }else{
        if(options.debug){
          _log('商品不存在');
          return false;
        }
      }
    },
    updateQuantity: function(item){ //更新商品的数量
      //更新一个商品
      var index = this.getItemIndex(item.sku);
      if(index > -1){
        items[index].quantity = item.quantity;
        _saveCookie();
      }else{
        if(options.debug){
          _log('商品不存在');
          return false;
        }
      }
    },
    emptyCart: function(){
      //清空数组
      items.length = 0;
      _saveCookie();
    },
    checkout: function(){
      //点击结算后的回调函数
      if(options.callback){
        options.callback();
      }
    },
    getTotalCount: function(sku){
      //获取购物车商品的数量,如果传某个商品的id,那么就返回该商品的数量
      var totalCount = 0;
      if(sku){
        totalCount = (typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).quantity );
      }else{
        for(var i=0,l=items.length;i<l;i++){
          totalCount += (parseInt(items[i].quantity) === 'NaN' ? 0 : parseInt(items[i].quantity )) ;
        }
      }
      return totalCount;
    },
    getTotalPrice : function(sku){
      //获取购物车商品的总价格 ,如果传某个商品的id,那么就返回该商品的总价格
      var totalPrice = 0.0;
      if(sku){
        var num = parseInt((typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).quantity )),
        price = parseFloat((typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).price ));
        num = num=== 'NaN' ? 0 : num;
        price = price === 'NaN' ? 0 : price;
        totalPrice = price * num;
      }else{
        for(var i=0,l=items.length;i<l;i++){
          totalPrice += (parseFloat(items[i].price ) * parseInt(items[i].quantity));
        }
      }
      return totalPrice.toFixed(options.decimal);
    },
    getCookie : getCookie,
    setCookie : setCookie
  };


  /**
   * 设置cookie
   * @name setCookie
   * @example
    setCookie(name, value[, options])
   * @params {string} name 需要设置Cookie的键名
   * @params {string} value 需要设置Cookie的值
   * @params {string} [path] cookie路径
   * @params {Date} [expires] cookie过期时间
   */
  function setCookie(name, value, options) {
    options = options || {};
    var expires = options.expires || null;
    var path = options.path || "/";
    var domain = options.domain || document.domain;
    var secure = options.secure || null;
    /**
    document.cookie = name + "=" + escape(value)
    + ((expires) ? "; expires=" + expires.toGMTString() : "")
    + "; path=" + path
    + "; domain=" + domain ;
    + ((secure) ? "; secure" : "");
    */
    var str = name + "=" + encodeURIComponent(value)
    + ((expires) ? "; expires=" + expires.toGMTString() : "")
    + "; path=/";
    document.cookie = str;
  };

  /**
   * 获取cookie的值
   * @name getCookie
   * @example
    getCookie(name)
   * @param {string} name 需要获取Cookie的键名
   * @return {string|null} 获取的Cookie值,获取不到时返回null
   */
  function getCookie(name) {
    var arr = document.cookie.match(new RegExp("(^| )" + name
        + "=([^;]*)(;|$)"));
    if (arr != null) {
      return decodeURIComponent(arr[2]);
    }
    return undefined;
  };

  //***********************私有方法********************/
  function _saveCookie(){
    var i=0,l=items.length;
    if(l>0){
      var tItems = [];
      for(;i<l;i++){
        var item = items[i];
        tItems[i] = item.sku + '|' +item.name + '|' + item.price + '|' + item.quantity;
      };
      var str = tItems.join('&');
      setCookie(options.cartName, str, {expires:options.expires});
    }else{
      setCookie(options.cartName, '', {expires:options.expires});
    }

  };

  //***********************工具方法********************/
  //显示调试信息
  function _log(info){
    if(typeof console != 'undefined'){
      console.log(info);
    }
  };
  //继承属性
  function extend(destination, source) {
    for ( var property in source) {
      destination[property] = source[property];
    }
  };
}(typeof window === 'undifined' ? this: window);

HTML页面简单调用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

</head>
<body>

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

  <script>

    shopCart.init({
      'decimal' : 4
      });

    var a = new item('aa','bb',12,22);
    shopCart.addItem(a); //添加商品到购物车,参数item
    shopCart.delItem('12345'); //从购物车中删除商品,参数squ
//    shopCart.emptyCart(); //清空购物车
    item.quantity = 4;
    alert(shopCart.getTotalPrice()); //获取购物车中的数量,参数squ


    shopCart.findItem();//根据sku标示查找商品,参数squ
      //如果木有提供sku,则返回所有的item
    shopCart.getItemIndex('aa') //获取item在items的数组下标,参数squ
    shopCart.updateQuantity(a) //更新商品的数量,参数item
    shopCart.getTotalCount()//获取购物车商品的数量,如果传某个商品的id,那么就返回该商品的数量,参数squ
  </script>

</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 匿名调用实现代码
Jun 19 Javascript
JavaScript中几种常见排序算法小结
Feb 22 Javascript
javascript真的不难-回顾一下基础知识
Jan 15 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
Dec 16 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
JavaScript如何禁止Backspace键
Dec 02 Javascript
JavaScript中通过提示框跳转页面的方法
Feb 14 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
Vue实现路由跳转和嵌套
Jun 20 Javascript
Vuex的热更替如何实现
Jun 05 Javascript
浅谈Node.js 中间件模式
Jun 12 #Javascript
浅谈Webpack打包优化技巧
Jun 12 #Javascript
关于TypeScript模块导入的那些事
Jun 12 #Javascript
JS实现前端页面的搜索功能
Jun 12 #Javascript
微信小程序实现弹出菜单功能
Jun 12 #Javascript
微信小程序实现折叠与展开文章功能
Jun 12 #Javascript
微信小程序收藏功能的实现代码
Jun 12 #Javascript
You might like
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
对python自动生成接口测试的示例讲解
2018/11/30 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
12月红领巾广播稿
2014/02/13 职场文书
团委竞选演讲稿
2014/04/24 职场文书
事业单位考核材料
2014/05/21 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
公司新员工欢迎词
2015/09/30 职场文书