cookie|javascript|初學 [譯者註:將本文的最後範例程式碼拷貝至文字檔中,更名檔案為homepage.htm格式檔案,在瀏覽器中運行,本文以該範例程式碼講解
簡介
====================================
問題是我想解決自動訪問http://www.thehungersite.com。這個頁面能夠限制你每一天只訪問它一次(不要忘記在這連結上點擊)。
現在為止,每次一開始我做的第一件事就是手工選擇我的書籤載入這個頁面。
為什麼不為它建立一個簡單的指令碼程式呢?
因為我想讓它在Netscape和IE下都能夠同樣的工作,我開始學習Javascript。
解決
====================================
主題思想很簡單:建立一個頁面並測試一下今天這個頁面是否已被載入過,
如果沒有載入,那就通過它連結到http://www.thehungersite.com,並且設定
這個頁面作為瀏覽器的首頁。
擷取頁面並重新導向是很容易的,問題是如何記憶這個頁面已被訪問過。
因為Javascript沒有檔案訪問的功能,看來我們只能使用cookies了。
Cookies是一個有大小限制的變數,它與一個伺服器的網域名稱相關聯,
預設情況下cookie的生存期是當瀏覽器關閉時被清空(注意:不是當你離開
這個頁面的時候),但可以用一個指令碼程式改變這種情況,
在使用者關閉瀏覽器後使cookies能夠儲存下來,Netscape在檔案中使用所有的
Cookie,而IE分別儲存每個cookie。此外,不同的瀏覽器會帶來一些意想
不到的情況,你必須確定一個使用者在它的瀏覽器設定中是否關閉了cookies。
一切都很好也很妙,只是現在我還未在IE中測試它,調用樣本Javascript語句:
cookieExpires = "01-APR-" + nLyear + " GMT";
document.cookies = cookieName + "=" + cookieValue + "; expires=" + cookieExpires;
然後調用
document.write(document.cookie);
document.cookie是空的。
在實驗和研究了一下上面的樣本程式後,會發現:
1。你不能夠讀和顯示cookie。如果你想看一下這個cookie你需要指定與它相同的另一個字串變數,如下:
document.cookie = cookieName + "=" + cookieValue + "; expires=" + cookieExpires;
myvar = cookieName + "=" + cookieValue + "; expires=" + cookieExpires;
document.write(myvar);
2. 瀏覽器用了不同的日期格式:
Netscape使用"GMT"結束,IE使用“UTC",這是因為它可以更好的構建一個日期,象下面這樣:
var expdate = new Date()
cookieExpires.setTime (expdate.getTime() + 1 * (24 * 60 * 60 * 1000)) //+1 day
cookieExpires.toGMTString()
當你顯示日期部分
document.write(expdate.getYear() + "<br>" + expdate.getMonth() + "<br>" + expdate.getDate());
對於2000-11-15的日期,在IE中顯示為2000/10/15,在Netscape下顯示100/10/15(註:已確定是一些較低版本的
Netscape 瀏覽器的Y2K問題)
樣本中看到像下面這樣的部分:
if (platform == "Mac") {
lastVisit = lastVisit - (24 * 60 * 60 * 1000)
}
但我不可能檢測它。
日期對象有getDate和getDay的方法,第二個方法返回在一周中天的索引號。
----------------------------------------
知道了這些,基本上就沒問題了(現在你可以看一下homepage.htm)
[譯者註:將本文的最後範例程式碼拷至文字檔中並儲存htm格式,然後運行]
最後要說明的是,這不僅是一個專用的JS指令碼,如果你想將它用在你的web頁面上你必須最小程度的使用不同的瀏覽器測試它並注意它們的版本,許多的指令碼程式包含了瀏覽器類型檢測和大量的if...else語句,以處理這樣不同。
樣本頁面homepage.htm原始碼
<html>
<head>
<title>Homepage</title>
</head>
<body>
<a href='http://www.thehungersite.com/'>Manual redirection<br></a>
<a href="javascript:ResetCookie()">Cookie reset</a>
<script language="JavaScript">
<!--
var bVisitedToday = false;
var lastVisit = GetCookie("lastVisit");
if (lastVisit != null)
{
lastVisit = 1 * lastVisit;
var lastHere = new Date(lastVisit);
var rightNow = new Date();
if(lastHere.getYear() == rightNow.getYear()
&& lastHere.getMonth() == rightNow.getMonth()
&& lastHere.getDate() == rightNow.getDate())
{
bVisitedToday = true;
}
}
if(bVisitedToday == false)
{
setLastlastVisitCookie();
window.location="http://www.thehungersite.com/"
}
else
{
//window.location="about:blank"
}
function getCookieVal (offset)
{
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
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 getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
function SetCookie (name, value)
{
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
function setLastlastVisitCookie ()
{
var rightNow = new Date();
var expdate = new Date();
expdate.setTime (expdate.getTime() + 1 * (24 * 60 * 60 * 1000)); //+1 day
SetCookie ("lastVisit", rightNow.getTime(), expdate, "/");
}
function ResetCookie()
{
SetCookie("lastVisit", 0, null, "/");
}
// -->
</script>
</body>
</html>