5

これまで Cookie を使用したことがないため、よく知らないコードを使用しています。

選択ボックスの場合、10番目のインデックス以降の値では機能しないことに気付くまで、すべて正常に機能していました。(インデックス 10 以上の場合)。

システムに保存されている Cookie を確認しましたが、正しく保存されていないようです。(select10を見た)ETCはきちんと収納されていた。

ただし、ボディのオンロードを実行すると、値が正しくロードされません。

私が使用しているクッキーコードは次のとおりです。

<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>

問題は、上記のコード ブロックの約 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');">

(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)

0 から数えることを忘れていたため、1 ずれていました。2 番目の引数は必要ありません。既定値は文字列の残りの部分です。

最初の 10 個のメニュー項目で機能した理由は、部分文字列の癖です。2 番目の引数が最初の引数よりも小さい場合、それらを交換します! Soは、文字列の最後の文字を取得する"select5".substring(7, 6)として扱われます。"select5".substring(6, 7)しかし、より長い文字列の場合`"select35".substring(7, 7)は、空の文字列である でした。

于 2012-12-25T05:50:48.233 に答える