萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> JS無法清除Cookie的解決方法

JS無法清除Cookie的解決方法

   項目中使用sdmenu.js時,需要在登錄時清除Cookie,而sdmenu默認是會保存Cookie的

  下面是sdmenu.js保存Cookie的方法

  document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";

  下面是我到網上找的清除Cookie的方法,始終都無法刪除Cookie

  1、傳遞Cookie名稱

  function deleteCookie(name){

  var date=new Date();

  date.setTime(date.getTime()-10000);

  document.cookie=name+"=v; expire="+date.toGMTString()+"; path=/";

  2、循環刪除所有Cookie

  // js 遍歷所有Cookie

  function foreach()

  {

  var strCookie=document.cookie;

  var arrCookie=strCookie.split("; "); // 將多cookie切割為多個名/值對

  for(var i=0;i

  { // 遍歷cookie數組,處理每個cookie對

  var arr=arrCookie[i].split("=");

  if(arr.length>0)

  DelCookie(arr[0]);

  }

  }

  function GetCooki(offset)

  {

  var endstr = document.cookie.indexOf (";", offset);

  if (endstr == -1)

  endstr = document.cookie.length;

  return decodeURIComponent(document.cookie.substring(offset, endstr));

  }

  function DelCookie(name)

  {

  var exp = new Date();

  exp.setTime (exp.getTime() - 1);

  var cval = GetCookie (name);

  document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString();

  }

  function GetCookie(name)

  {

  var arg = name + "=";

  var alen = arg.length;

  var clen = document.cookie.length;

  var i = 0;

  while (i < clen)

  {

  var j = i + alen;

  if (document.cookie.substring(i, j) == arg)

  return GetCooki (j);

  i = document.cookie.indexOf(" ", i) + 1;

  if (i == 0) break;

  }

  return null;

  }

  後來發現一個網友的博客,介紹了無法刪除Cookie的原因

  該博客原文如下:

  今天遇到一個cookie的問題: 名叫username的,域為www.45it.net的cookie無法刪除,導致用戶登錄以後無法退出。搞了半天終於發現問題所在:原來是我關於cookie的基礎知識沒搞清楚 。。。。

  Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。 其中,不同的域、不同的路徑下可以存在同樣名字的cookie。 比如這個頁面: 用鼠標戳我

  一般我們刪除cookie的方法是用一個同樣名字、過期時間為過去某個時候的Cookie覆蓋之。 這時就一定要搞清楚你要刪除的cookie的域和路徑,Cookie域和路徑要一樣才能被覆蓋。 否則產生的效果就是那個想要被刪除的Cookie具有神奇的生命力,無法被清除~~~

  另外,我發現在設置Cookie的時候,如果沒有指定域名,那麼設置的這個cookie的域默認為當前域,比如www.45it.net。 如果設置的時候指定了某個域,那麼浏覽器存的時候會自動在前面加.。比如PHP代碼: setcookie('test','a',0,'www.45it.net'); 那麼 浏覽器裡面存的Cookie的域為.www.45it.net。 所以,最好的方式是設置Cookie的時候怎麼寫的,刪除的時候就怎麼寫。 要不就會出現我遇到的情況: 明明浏覽器裡看有 username=longbill,域為www.45it.net的Cookie,但是在php裡寫 setcookie('username','',time()-1000,'www.45it.net','/'); 無法刪除那個Cookie。 原因就是我刪Cookie的操作其實上是發了一個新的名叫username、值為空、過期時間為過去1000秒、域為.www.45it.net、路徑為/的Cookie。這個Cookie發到浏覽器馬上就過期了,什麼也看不到。而我要刪除的在http://www.45it.net/上的cookie還活的好好的。。。

  原來是刪除Cookie的代碼中沒有加 路徑(path)

  原:

  document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";

  新:

  var date=new Date();

  date.setTime(date.getTime()-10000);

  document.cookie=name+"=v; expire="+date.toGMTString()+"; path=/";

  除了路徑(path),可能還有域等其它情況,保險的方式就是 設置Cookie時是什麼樣式,刪除時就應該是什麼樣式,加上expire屬性就行了

copyright © 萬盛學電腦網 all rights reserved