4

对于具有 javascript 技能的人来说,这可能是一个简单的解决方案(轻松 +200 声望)。

问题演示:http ://shoppingcart-bthub.blogspot.com/只需将所有商品添加到购物车并单击刷新即可查看 cookie 的问题。

一切正常,除了处理添加到购物车的商品的 cookie 的代码部分。出于某种原因,它只包含 2 -5 个项目,具体取决于浏览器:

谷歌浏览器 - 仅包含 2 件商品(购物车中的所有其他商品在页面重新加载后消失)

Firefox - 共 4 项

野生动物园 - 4

互联网浏览器 - 5

演示中的 javascript:http: //shopppingcart.googlecode.com/files/simplecart.js

上面的 javascript 链接部分被编码为处理 cookie:

    /*** data storage and retrival ****/ 
/* load cart from cookie */ 
me.load = function () {
var me = this;
 /* initialize variables and items array */
me.items = {};
me.total = 0.00;
me.quantity = 0;

 /* retrieve item data from cookie */
if( readCookie('simpleCart') ){
var data = unescape(readCookie('simpleCart')).split('++');
for(var x=0, xlen=data.length;x<xlen;x++){
var info = data[x].split('||');
var newItem = new CartItem();   
if( newItem.parseValuesFromArray( info ) ){
newItem.checkQuantityAndPrice();

/* store the new item in the cart */
 me.items[newItem.id] = newItem;
 }
 }
 }
 me.isLoaded = true;
};

/* save cart to cookie */
me.save = function () {
var dataString = "";
for( var item in this.items ){
dataString = dataString + "++" + this.items[item].print();
}
createCookie('simpleCart', dataString.substring( 2 ), 30 );
};

要测试完整的实时代码:

对于包含所有代码的完整实时模板,请在 blogger.com 上打开一个免费博客并在此处下载 XML 模板以上传到博客: http: //www.bloggermint.com/2011/05/shopping-cart-blogger-template /免费下载位于左侧边栏中。还请按照该页面上的说明使其在 blogger.com 中运行

4

2 回答 2

6

在我看来,这个问题与 4K cookie 大小限制有关。
您的shopppingcart代码正在尝试将所有项目数据存储在simpleCartcookie 中,但是当此类数据大于 4K 时,即使它们显示在购物车中,这些项目也不会存储到 cookie 中,因此当重新加载页面时,这些项目会消失. 以网站http://shoppingcart-bthub.blogspot.in/
为例,特别是“Sony VAIO 笔记本电脑”项目的 HTML 标记:

<table border="1" style="width: 660px;">
    <tbody>
        <tr>
            <th class="item_thumb" id="thumb" width="45%"><img border="0" src="http://3.bp.blogspot.com/-LcQD--Bb_YE/TeDI44AmUsI/AAAAAAAACBw/K4IJZE2CpMY/s1600/sony+vaio.JPG"></th>
            <td>
                <input class="item_add" type="button" value="Add to Cart" id="s1">
            </td>
        </tr>
        <tr>
            <th><b>Item Name</b></th>
            <td class="item_name">Sony VPCEE42FX 15.5" 2.30GHz 500GB VAIO Laptop</td>
        </tr>
        <tr>
            <th><b>Price</b></th>
            <td class="item_price">$610.00</td>
        </tr>
        <tr>
            <th><b>Description</b></th>
            <td class="item_Description">
            The VPCEE42FX is big enough to be useful, but small 
            enough to be portable. With 500GB of hard drive space, youll have to work hard 
            to fill up the memory. The 15.5 HD resolution screen and AMD Mobility Radeon HD 
            graphics card ensure that youll see crisp, fast action, even when youre watching 
            DVDs on the DVD drive. And at under six pounds, the laptop is easy to pack up 
            and haul with you.
            </td>
        </tr>
        <tr>
            <th><b>Available Stock</b></th>
            <td>2 more available</td>
        </tr>
    </tbody>
</table>

当将此产品添加到购物车时,simpleCartcookie 将包含以下字符串:

id=c10||thumb=%3Cimg%20border%3D%220%22%20src%3D%22http%3A//3.bp.blogspot.com/-LcQD--Bb_YE/TeDI44AmUsI/AAAAAAAAACBw/K4IJZE2CpMY/s1600/sony +vaio.JPG%22%3E%0A||name=Sony%20VPCEE42FX%2015.5%22%202.30GHz%20500GB%20VAIO%20Laptop||price=610||description=%20VPCEE42FX%20is%20big%20enough%20to %20be%20useful%2C%20but%20small%20enough%20to%20be%20%0Aportable.%20With%20500GB%20of%20hard%20drive%20space%2C%20youll%20have%20to%20work%20hard%20to%20% 0Afill%20up%20the%20memory.%20The%2015.5%20HD%20resolution%20screen%20and%20AMD%20Mobility%20%0ARadeon%20HD%20graphics%20card%20ensure%20that%20youll%20see%20crisp%2C%20fast%20action %2C%20even%20%0Awhen%20youre%20watching%20DVDs%20on%20the%20DVD%20drive.%20And%20at%20under%20six%20pounds%2C%20the%20%0Alaptop%20is%20easy%20to%20pack% 20up%20and%20haul%20with%20you.||数量=1

如您所见,似乎所有<td>以类名开头的元素item_都存储在cookie中。
Chrome 开发者工具显示此 cookie 的大小为 828 字节。
因此,可以添加到购物车的商品数量是可变的,并且取决于每个商品数据的长度(名称、描述等)。
那么,你能做些什么来避免这个问题呢?

  1. 将项目 HTML 标记减少到最低限度,例如通过删除item_thumbitem_Description元素。
  2. 修改代码中的addToCart方法,simplecart.js通过存储更少的信息来减少cookie的长度(详见下文)。
  3. 修改代码中的createCookie,readCookieeraseCookie函数simplecart.js以使用本地存储而不是 cookie 来存储项目数据(查看此页面以获取代码示例,或在下面查看另一个示例)。

例如,为了避免在 cookie 中存储“thumb”和“Description”项字段,您可以修改addToCart方法如下:

ShelfItem.prototype.addToCart = function () {
  var outStrings = [],valueString;
  for( var field in this ){
    if( typeof( this[field] ) != "function" && field != "id" ){
      valueString = "";

      //console.log(field);
      switch(field){
        case "price":
          if( this[field].value ){
            valueString = this[field].value;
          } else if( this[field].innerHTML ) {
            valueString = this[field].innerHTML;
          }
          /* remove all characters from price except digits and a period */
          valueString = valueString.replace( /[^(\d|\.)]*/gi , "" );
          valueString = valueString.replace( /,*/ , "" );
          break;
        case "image":
          valueString = this[field].src;
          break;
        case "thumb":
        case "Description":
        case "description":
          /* don't store "thumb" and "description" in the cookie */
          break;
        default:
          if( this[field].value ){
            valueString = this[field].value;
          } else if( this[field].innerHTML ) {
            valueString = this[field].innerHTML;
          } else if( this[field].src ){
            valueString = this[field].src;
          } else {
            valueString = this[field];
          }
          break;
      }
      outStrings.push( field + "=" + valueString );
    }
  }
}

如果浏览器支持,更好的方法是使用localStorage它,否则使用 cookie 作为后备:

function supports_html5_storage() {
  try {
    return 'localStorage' in window && window['localStorage'] !== null;
  } catch (e) {
    return false;
  }
}

function createCookie(name,value,days) {
  if (supports_html5_storage()) {
    if (value == '') {
      eraseCookie(name);
    } else {
      window.localStorage.setItem(name, JSON.stringify(value));
    }
  } else {
    if (days) {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
  }
}

function readCookie(name) {
  if (supports_html5_storage()) {
    return window.localStorage.getItem(name);
  } else {
    var ca = document.cookie.split(';');
    var nameEQ = name + "=";
    for(var i=0;i < ca.length;i++) {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
  }
}

function eraseCookie(name) {
  if (supports_html5_storage()) {
    window.localStorage.removeItem(name);
  } else {
    createCookie(name,"",-1);
  }
}

使用时localStorage我们也可以毫无问题地存储thumband字段(因为我们有 5 Mb 的空间),因此我们可以这样进一步修改函数:descriptionShelfItem.prototype.addToCart

  ...
  case "thumb":
  case "Description":
  case "description":
    if (!supports_html5_storage()) break;
  ...
于 2013-07-14T12:05:37.757 回答
1

看起来你在黑暗的房间里抓到黑猫,但猫不在那里。

所以我做了什么:

  1. 获取http://shopppingcart.googlecode.com/files/simplecart.js
  2. 从http://wojodesign.com/simpleCart/获取 html
  3. 用你的替换 simplecart.js。

我发现了什么:

  1. 当您从文件系统打开 html 页面时,您就拥有了
  2. 如果你把它放在服务器上(在我的例子中是本地的 apache 实例),那么一切正常

2 集。

您试图在 cookie 中放入大量信息。像这样修改打印功能的简单方法

CartItem.prototype.print = function () {
    var returnString = '';
    for( var field in this ) {
      if( typeof( this[field] ) != "function" && field !="description") {
        returnString+= escape(field) + "=" + escape(this[field]) + "||";
      }
    }
    return returnString.substring(0,returnString.length-2);
  };

您真的需要 cookie 中的所有项目字段吗?

于 2013-07-14T04:42:12.420 回答