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 相关文章推荐
JavaScript RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
jQuery 连续列表实现代码
Dec 21 Javascript
JavaScript的parseInt 取整使用
May 09 Javascript
js实现的仿新浪微博完美的时间组件升级版
Dec 20 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
Dec 30 Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
图解prototype、proto和constructor的三角关系
Jul 31 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
对于input 框限定输入值为浮点型的js代码
Sep 25 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实现框架(一)
2006/10/09 PHP
超级简单的php+mysql留言本源码
2009/11/11 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue观察模式浅析
2018/09/25 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
实习单位接收函模板
2014/01/10 职场文书
六十大寿答谢词
2014/01/12 职场文书
大学生创业项目方案
2014/03/08 职场文书
党性心得体会
2014/09/03 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
党员个人自我评价
2015/03/03 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
2022年四月新番
2022/03/15 日漫
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技