2012-12-25 58 views
4

我以前從未使用過cookies,所以我使用了一些我很不熟悉的代碼。javascript表單 - 只選擇前10個索引的開放cookie

它工作得很好,直到我剛纔注意到對於選擇框,它不適用於第十個索引之後的任何值。 (索引10及以上)。

我看了看存儲在我的系統上的cookie,它似乎不能正確保存它們。 (我看到select10)ETC正確存儲。

然而,當它運行onload身體時,它不會正確加載值。

這裏是我使用的cookie代碼:

<SCRIPT LANGUAGE="JavaScript"> 

<!-- Begin 

var expDays = 100; 
var exp = new Date(); 

exp.setTime(exp.getTime() + (expDays*24*60*60*1000)); 

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" : ""); 
} 

// use the following code to call it: 
// <body onLoad="cookieForms('open', 'form_1', 'form_2', 'form_n')" onUnLoad="cookieForms('save', 'form_1', 'form_2', 'form_n')"> 

function cookieForms() { 
    var mode = cookieForms.arguments[0]; 

    for(f=1; f<cookieForms.arguments.length; f++) { 
     formName = cookieForms.arguments[f]; 

     if(mode == 'open') {  
      cookieValue = GetCookie('saved_'+formName); 

      if(cookieValue != null) { 
       var cookieArray = cookieValue.split('#cf#'); 

       if(cookieArray.length == document[formName].elements.length) { 
        for(i=0; i<document[formName].elements.length; i++) { 
         if(cookieArray[i].substring(0,6) == 'select') { document[formName].elements[i].options.selectedIndex = cookieArray[i].substring(7, cookieArray[i].length-1); } 
         else if((cookieArray[i] == 'cbtrue') || (cookieArray[i] == 'rbtrue')) { document[formName].elements[i].checked = true; } 
         else if((cookieArray[i] == 'cbfalse') || (cookieArray[i] == 'rbfalse')) { document[formName].elements[i].checked = false; } 
         else { document[formName].elements[i].value = (cookieArray[i]) ? cookieArray[i] : ''; } 
        } 
       } 
      } 
     } 

     if(mode == 'save') {  
      cookieValue = ''; 

      for(i=0; i<document[formName].elements.length; i++) { 
       fieldType = document[formName].elements[i].type; 

       if(fieldType == 'password') { passValue = ''; } 
       else if(fieldType == 'checkbox') { passValue = 'cb'+document[formName].elements[i].checked; } 
       else if(fieldType == 'radio') { passValue = 'rb'+document[formName].elements[i].checked; } 
       else if(fieldType == 'select-one') { passValue = 'select'+document[formName].elements[i].options.selectedIndex; } 
       else { passValue = document[formName].elements[i].value; } 
       cookieValue = cookieValue + passValue + '#cf#'; 
      } 
      cookieValue = cookieValue.substring(0, cookieValue.length-4); // Remove last delimiter 
      SetCookie('saved_'+formName, cookieValue, exp);  
     } 
    } 
} 

// End --> 
</script> 

我beleive問題在於以下行,發現的方式約3/4以上下降(68行)的代碼塊:

if(cookieArray[i].substring(0,6) == 'select') { document[formName].elements[i].options.selectedIndex = cookieArray[i].substring(7, cookieArray[i].length-1); } 

僅供參考,這裏是我使用的口主體標籤:

<body style="text-align:center;" onload="cookieForms('open', 'ramsform', 'decksform', 'hullsform', 'crewform', 'shipwrightform'); Swap(crew0z,'crew0i'); Swap(crew1z,'crew1i'); Swap(crew2z,'crew2i'); Swap(crew3z,'crew3i'); Swap(crew4z,'crew4i'); Swap(crew5z,'crew5i'); Swap(crew6z,'crew6i'); Swap(crew7z,'crew7i'); Swap(crew8z,'crew8i'); Swap(crew9z,'crew9i');" onunload="cookieForms('save', 'ramsform', 'decksform', 'hullsform', 'crewform', 'shipwrightform');"> 

(請無視掉( )的,因爲它們是不相關的)

頁我的工作,可以發現:http://webhostlet.com/POP.htm

+1

樣式註釋:不要在'onXXX ='屬性中放置太多的代碼,讓他們調用一個可以執行所有操作的函數。 – Barmar

+1

你對jQuery解決方案感興趣嗎?有一個插件可以保存和恢復cookie中表單的內容。 – Barmar

+0

嘿巴爾馬。我知道風格很糟糕。這是我第一次回到多年來與編碼有關的任何事情。你應該看到我的JavaScript運行這個計算器的狀態,好神!大聲笑。 我對任何使這項工作老實的東西感興趣。我有幾種形式,我需要將所有這些形式存儲在Cookie中。我不認爲大部分的行都是在我上面發佈的代碼中模糊的想法之外做的,這就是爲什麼我不能充分理解它。我很確定問題在於我抽出的一條線。它只能從選擇 – pingu2k4

回答

1

在這兩個opensave代碼,更改:

document[formName].elements[i].options.selectedIndex 

到:

document[formName].elements[i].selectedIndex 

options是所有選項的數組,selectedIndex屬性屬於select包含它們的元素。

變化:

cookieArray[i].substring(7, cookieArray[i].length-1) 

到:

cookieArray[i].substring(6) 

您可以通過1,因爲你忘了,它是從0計數爲關閉。第二個參數是不需要的,它默認爲字符串的其餘部分。

它爲前10個菜單項工作的原因是一個子串的怪癖:如果第二個參數比第一個低,它會交換它們!因此"select5".substring(7, 6)被視爲"select5".substring(6, 7),它獲取字符串的最後一個字符。但是對於較長的字符串,它是`"select35".substring(7, 7),它是一個空字符串。

+0

的第一個字符開始,謝謝。我已經這樣做了,但它並沒有解決問題,對不起。選擇選項列表中的前10個項目中的任何一個都可以正常工作,但在此之後選擇任何項目都不會。 我看着存儲的cookie,它似乎很好地保存它們。如果指數爲10或更高,它不會因爲某種原因而被讀出。我猜測其一個問題,這條線的子部分: 如果(cookieArray [I] .substring(0,6)== '選擇'){文件[表格名稱] .elements [I] .selectedIndex = cookieArray [ i] .substring(7,cookieArray [i] .length-1); } 在開放代碼中。 http://webhostlet.com/POP.htm 如果選擇在右邊的表中的複選框低下來選擇,他們沒有工作,如果您: – pingu2k4

+0

BTW,你可以看到這個真人版刷新頁面。前10名,但是,工作很好。 – pingu2k4

+1

查看編輯答案。 – Barmar