4

我目前正在使用 javascript 并尝试通过 cookie 将 sessionGUID 传递到使用 IE9 新打开的窗口。我希望避免将 sessionGUID 放在查询字符串上。

我正在使用以下代码打开新窗口并将 cookie 分配给新窗口:

var pathname = /msgViewer.htm?A=" + aGUID + "&Detached=yes"; 
var myWindow = window.open(pathname, "detached_window");
myWindow.document.cookie = "SG=" + sGUID;

但是,当 (document).ready 在新窗口中执行时,cookie 似乎没有设置。

$(document).ready(function () {
...
sGUID = getCookie("SG");
...
[call to AJAX webservice that requires sGUID be passed]

...

    function getCookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
            end = dc.length;
        }
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

当我在 getCookie 调用后设置(测试)警报时,sGUID 未定义,但是警报引起的延迟(用户输入)允许在此之后读取 cookie。

如何确保在 $(document).ready 执行之前在新窗口中设置 cookie?...或者至少确保在从 cookie 中检索 sessionGUID 之前不调用 web 服务?

该问题在 FireFox 或 Chrome 中不存在——仅在 IE 中。

提前感谢您的考虑...

更新 (20121115):此链接http://ellislab.com/forums/viewthread/220241/表明 cookie 数据在发出页面请求之前可能不可用。上述情况通常只发生在初始登录期间或删除 cookie 之后(并且仍然断断续续)我当前的解决方案/解决方法是打开和关闭临时窗口并重新检索 cookie。由于无论如何都会在打开新窗口时发生此问题,因此额外的窗口闪烁并不明显。我还将 cookie 的检索移到了 $(document).ready 函数之外。这是附加代码:

sGUID = getCookie("SG");
if (sGUID == null) {
    var jwURL = "/Test.htm";
    jw = window.open(jwURL, "junk_window",width=1,height=1);
    jw.close();
    sGUID = getCookie("SG");
}
4

1 回答 1

0

“更新 20121115”(打开/关闭临时窗口)确实解决了我的问题。我最终确实使用了不同的 getCookie 函数来检索 cookie-但这与我最初的问题没有直接关系:

   function getCookie(c_name) {
        var i, x, y, ARRcookies = document.cookie.split(";");
        for (i = 0; i < ARRcookies.length; i++) {
            x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
            y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
            x = x.replace(/^\s+|\s+$/g, "");
            if (x == c_name) {
                return unescape(y);
            }
        }
    }
于 2012-11-16T13:40:17.960 回答