2008-09-24 60 views
0

IM:幫助使用設置/獲取刪除的cookie下面的代碼一些簡單的JavaScript餅乾誤解

function get_cookie(cookie_name) 
{ 
    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)'); 

    if (results) 
     return (decodeURI(results[2])); 
    else 
     return null; 
} 


function set_cookie(name, value, exp_y, exp_m, exp_d, path, domain, secure) 
{ 
    var cookie_string = name + "=" + encodeURI(value); 

    if (exp_y) 
    { 
     var expires = new Date(exp_y, exp_m, exp_d); 
     cookie_string += "; expires=" + expires.toGMTString(); 
    } 

    if (path) 
     cookie_string += "; path=" + encodeURI(path); 

    if (domain) 
     cookie_string += "; domain=" + encodeURI(domain); 

    if (secure) 
     cookie_string += "; secure"; 

    document.cookie = cookie_string; 
} 


function delete_cookie(cookie_name) 
{ 
    var cookie_date = new Date(); // current date & time 
    cookie_date.setTime(cookie_date.getTime() - 1); 
    document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString(); 
} 

,但我得到不一致的結果。例如, ,首頁(www.example.com/start)上設置的cookie不會始終顯示在後續頁面上(www.example.com/foo/thing.jsp)。 我使用

set_cookie("beginrequest", (new Date()).getTime(), null, null, null, "/"); 

設置頁面的一個cookie 「onunload的」 和檢索通過

+刪除它 「的onLoad」

loadDur =(新的Date())的getTime() - get_cookie(「的BeginRequest 「); delete_cookie(「beginrequest」);

來測量頁面加載的總時間量。

當使用螢火蟲時,我經常看到「剩餘的」beginrequest-cookies和多次使用過去時間戳的beginrequest實例。

我怎樣才能在每個頁面上看到一個beginrequest-cookie?

回答

0

您對set_cookie,get_cookie和delete_cookie的代碼似乎是正確的。還有你的用法。

我認爲你應該把它移到你的Java代碼中 - 對我來說,它似乎比通過cookies破解這個更容易。

1

如果您收到的舊Cookie可能是因爲您的頁面包含大量內容,並且onunload之前未調用onload(因爲頁面未完成加載)。因此,通過從兩個onload事件和onunload的調用是這樣的刪除cookie:

var deleted_cookie = false; 
function delete_timestamp() { 
    if(!deleted_cookie) delete_cookie("beginrequest"); 
    deleted_cookie = true; 
} 

您還可能有一個競爭條件,如果你加載下一頁足夠快的「delete_cookie」餅乾已經無法正常到期,並且你的get_cookie實現正在挑選它。因此,嘗試改變正則表達式get_cookie只有拿起餅乾值:

var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]+)(;|$)'); 

另外,如果你在多個窗口(或標籤)查看網站,他們的Cookie可以得到混合,所以不要這樣做。但請嘗試使用全局正則表達式來獲取所有值,並僅使用最新的值。

0

我同意兩個計數上的amix:乍一看你的代碼看起來不錯,這可能會更好地處理服務器端的東西。

無論如何,在猜測中,我會說你目前遇到的問題很可能是事件並非以你認爲的方式開火。有兩種方法可以清除發生的事情,通過視覺上明顯的事件發生,以及增加輸出的詳細程度。如果你在onload和onunload事件觸發時打開一個新窗口(或一個警報,或其他),任何數量的東西都可能會干擾事件實際觸發:插件,插件,按鍵等等,你可以告訴確保函數被調用。同樣,如果您在Cookie中存儲更多數據,例如原始URL等,您將能夠更好地確定哪些網頁正在生成額外的Cookie。

我猜你的一個Firefox擴展間歇性地干擾了onunload事件。 -

1

贊同對方的建議,做一些在服務器端的工作,我已經在過去做到了這一點:

1)捕獲的服務器端請求的時間,和包括腳本標籤與頁面中的時間變量:

<script type="text/javascript"> var start = 1224068624230;</script> 

2)在頁面末尾,在JavaScript中,獲取新時間並計算總時間。