1

ポストバックのスクロール位置を保存/復元しようとしています。私のコードは、Firefox と、Internet Explorer を除くすべての主要なブラウザーで動作します。

    function saveScrollPosition() {

    // Save the cookie if the requestor is Internet Explorer
    if (navigator.appName.indexOf("Microsoft") != -1) {
       alert("Internet Explorer browser has been identified...");
       var scrollX, scrollY;
       var strA = "KulScrollPos=";
       var strB = ",";
       var strC = "; path=";

       // Depending on the version of Internet Explorer --- call the appropriate API
       if (!document.documentElement.scrollLeft)
         scrollX = document.body.scrollLeft;
       else
         scrollX = document.documentElement.scrollLeft;
       if (!document.documentElement.scrollTop)
         scrollY = document.body.scrollTop;
       else
         scrollY = document.documentElement.scrollTop;
       alert("scrollX = " + scrollX + " and " + "scrollY = " + scrollY);
       alert("strA = " + strA);

       //document.cookie = "KulScrollPos="+scrollX+","+scrollY+"; path="+document.location.pathname;
       document.cookie = strA.concat(scrollX, strB, scrollY, strC, document.location.pathname);
    }
    // Save the cookie for all other major browsers
    else {
       document.cookie = "KulScrollPos="+f_scrollLeft()+","+f_scrollTop()+"; path="+document.location.pathname;
    }
    alert("cookie = " + document.cookie)
}

function restoreScrollPosition() {
    alert("Entered the restore method...");
    cookieName = "KulScrollPos";

    if (document.title == "KFS :: Create Purchase Log") {
       resetScrollPosition();
       expireCookie( cookieName );
       return true;
    }
    else {
       var matchResult = document.cookie.match(new RegExp(cookieName+"=([^;]+);?"));
       if ( matchResult ) {
         var coords = matchResult[1].split( ',' );
         if (coords[1] != 0) {
           alert("Restoring the scroll position before scrollTo... " + coords[0] + " and " + coords[1]);
           window.scrollTo(coords[0],coords[1]);
           parent.window.scrollTo(coords[0],coords[1]);

        }
        expireCookie( cookieName );
        return true;
    }
    else {
     return false;
    }
}

Cookie 名を印刷している警告ボックスに注目してください。

Firefox は以下を出力します。

cookie = KulScrollPos=0,1946; kualiSessionId=A7807919-4719-D5B4-91D6-9CC04EEA1BA8;JSESSIONID=1F155C7FC23C48A4DAF557CA4B92D2CB

Internet Explorer は次のように出力します。

cookie = kualiSessionId=072BE31C-6AF5-6D4C-11A4-55E799790C6A; JSESSIONID=76D83E8E7EBA5F25B8A1B1990B9344E8

文字列 KulScrollPos=0,1946; に注意してください。クッキー名から除外されています。これは Internet Explorer でのみ発生します。

*** document.cookie = ... を設定している文字列変数 (コメント アウトされた行) を設定する別の方法を試しました。この行でも、上記と同じアラート出力が生成されました。

RestoreScrollPosition の ELSE ブロックに注目してください。このため、if (matchResult) 条件は常に失敗します。そのため、scrollTo メソッドを呼び出すコードが呼び出されることはありません。

うーん、文字列の連結が間違っていますか?FF が好きではない IE の機能は何ですか?

確かに非常に奇妙な行動です!

4

3 に答える 3

2

どうやら Internet Explorer は、二重引用符で囲まれた Cookie 名の "=" (等号) が気に入らないようです。「=」を解釈していました。リテラルとして受け入れるのではなく; したがって、一重引用符を使用して問題を解決しました。どうやら、IE には力を入れる必要があるようです。図に行く....

次のコードは、私が抱えていた問題を修正しました-

function saveScrollPosition() {

    // Save the cookie if the requesting browser is Internet Explorer
    if (navigator.appName.indexOf("Microsoft") != -1) {
        // Ensure that the cookie will be saved on IE version 5/+
        if (!document.documentElement.scrollLeft)
          scrollX = document.body.scrollLeft;
        else
          scrollX = document.documentElement.scrollLeft;
        if (!document.documentElement.scrollTop)
          scrollY = document.body.scrollTop;
        else
          scrollY = document.documentElement.scrollTop;
        document.cookie = 'KulScrollPos =' + scrollX+','+scrollY+';'+document.location.pathname;
    }

    // Save the cookie for all other major browsers
    else {
        document.cookie = "KulScrollPos="+f_scrollLeft()+","+f_scrollTop()+"; path="+document.location.pathname;
    }
}

学んだ教訓 -

Cookie 名に「=」記号を使用しないでください。それらが必要な場合は、一重引用符を使用して、解釈しないでリテラルとして受け入れるように IE に指示します。

于 2012-10-18T18:41:51.867 に答える
0

Cookie データにカンマを含めることはできません。スクロール データは、書き込む前にエンコードまたはエスケープし、読み取り時にデコードまたはエスケープ解除する必要があります。

編集:区切り文字を変更することもできます。パイプ ( | ) を試してみませんか?

于 2012-10-17T19:17:04.340 に答える
0

カンマは、複数の Cookie の有効な区切り文字です。コンマを%2C、またはescape()Cookie 値全体に置き換えてみてください。

于 2012-10-17T19:18:21.630 に答える