4

私は現在javascriptを使用しており、IE9を使用して新しく開いたウィンドウにCookieを介してsessionGUIDを渡そうとしています。クエリ文字列に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が新しいウィンドウに設定されていることを確認するにはどうすればよいですか?...または少なくとも、sessionGUIDがCookieから取得される前に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

「Update20121115」(一時ウィンドウの開閉)で問題が修正されました。私は最終的に別の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 に答える