5

我以前从未使用过 cookie,所以我使用了一段我非常不熟悉的代码。

它工作得很好,直到我刚才注意到对于选择框,它不适用于第十个索引之后的任何值。(对于索引 10 及以上)。

我查看了存储在我的系统上的 cookie,它似乎没有正确保存它们。(我看到 select10)ETC 存储正确。

但是,当它运行 onload of body 时,它没有正确加载值。

这是我正在使用的 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>

我相信问题出在以下行,在上面的代码块(第 68 行)的 3/4 处找到:

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');">

(请忽略 swap(),因为它们无关)

可以找到我正在处理的页面:http ://webhostlet.com/POP.htm

4

1 回答 1

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),它是一个空字符串。

于 2012-12-25T05:50:48.233 回答