【问题标题】:Internet Explorer cookie not being set properly using JavaScript未使用 JavaScript 正确设置 Internet Explorer cookie
【发布时间】:2012-10-17 19:05:46
【问题描述】:

我正在尝试保存/恢复 Postbacks 上的滚动位置。 我的代码适用于 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; 被忽略了 cookie 名称。这只发生在 Internet Explorer 中!

***我尝试了另一种方法来设置我正在设置 document.cookie = ... 的字符串变量(被注释掉的行)... 这行也产生了与上面显示的相同的警报输出。

在我的 RestoreScrollPosition 中注意我的 ELSE 块。 if (matchResult) 条件总是因此而失败,因此,我调用 scrollTo 方法的代码永远不会被调用!

Ughhh,我连接字符串是否错误? IE 不喜欢 FF 做什么?

确实非常奇怪的行为!

【问题讨论】:

    标签: javascript internet-explorer cookies scroll


    【解决方案1】:

    显然 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 不要解释它,而是接受它作为文字。

    【讨论】:

      【解决方案2】:

      Cookie 数据不应包含逗号。您需要在写入滚动数据之前对其进行编码或转义,然后在读取时对其进行解码或取消转义。

      编辑:您也可以只更改分隔符;也许试试管道(|)?

      【讨论】:

      • 这是一个非常敏锐的观察。我会试一试,让你知道它是如何工作的......
      【解决方案3】:

      逗号是多个 cookie 的有效分隔符。尝试将逗号替换为 %2Cescape() 整个 cookie 值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 2020-05-17
        • 2013-03-23
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多