0

Cookieの設定/削除に次のコードを使用しています:

function get_cookie(cookie_name)
{
    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');

    if (results)
        return ( decodeURI(results[2]) );
    else
        return null;
}


function set_cookie(name, value, exp_y, exp_m, exp_d, path, domain, secure)
{
    var cookie_string = name + "=" + encodeURI(value);

    if (exp_y)
    {
        var expires = new Date(exp_y, exp_m, exp_d);
        cookie_string += "; expires=" + expires.toGMTString();
    }

    if (path)
        cookie_string += "; path=" + encodeURI(path);

    if (domain)
        cookie_string += "; domain=" + encodeURI(domain);

    if (secure)
        cookie_string += "; secure";

    document.cookie = cookie_string;
}


function delete_cookie(cookie_name)
{
    var cookie_date = new Date();  // current date & time
    cookie_date.setTime(cookie_date.getTime() - 1);
    document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();
}

しかし、一貫性のない結果が得られます。たとえば、開始ページ (www.example.com/start) に設定された Cookie は、常に後続のページ (www.example.com/foo/thing.jsp) に表示されるとは限りません。を使用してページのCookie「onUnload」を設定しています

set_cookie("beginrequest", (new Date()).getTime(), null, null, null, "/");

「onLoad」を介して取得+削除する

loadDur = (new Date()).getTime() - get_cookie("beginrequest");
delete_cookie("beginrequest");

ページの読み込みにかかった合計時間を測定します。

firebug を使用すると、「残りの」beginrequest-cookie と、過去のタイムスタンプを持つ beginrequest の複数のインスタンスがよく見られます。

すべてのページで beginrequest-cookie を 1 つだけ表示するにはどうすればよいですか?

4

4 に答える 4

1

ページに多くのコンテンツが含まれていて、onunloadの前にonloadが呼び出されないことが原因である可能性がある古いCookieを取得している場合(ページの読み込みが完了していないため)。したがって、onloadとonunloadの両方から次のようなものを呼び出してCookieを削除します。

var deleted_cookie = false;
function delete_timestamp() {
    if(!deleted_cookie) delete_cookie("beginrequest");
    deleted_cookie = true;
}

また、次のページをロードするのに十分な速さで「delete_cookie」Cookieの有効期限が切れておらず、get_cookie実装がそれを取得している場合は、競合状態が発生する可能性があります。したがって、get_cookieの正規表現を変更して、値を持つCookieのみを取得してみてください。

var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]+)(;|$)');

また、複数のウィンドウ(またはタブ)でサイトを表示している場合は、Cookieが混同される可能性があるため、そうしないでください。ただし、グローバル正規表現を使用してすべての値を取得し、最新の値のみを使用してみてください。

于 2008-09-24T09:47:46.567 に答える
1

サーバー側でいくつかの作業を行うという他の提案を反映しています-私は過去にこれを行いました:

1) サーバー側でリクエストの時間をキャプチャし、ページに時間変数を含むスクリプト タグを含めます。

<script type="text/javascript"> var start = 1224068624230;</script>

2) ページの最後で、JavaScript で新しい時間を取得し、合計時間を計算します。

于 2008-10-15T11:06:47.403 に答える
0

set_cookie、get_cookie、delete_cookieのコードは正しいようです。そしてあなたの使用法も。

これをJavaコードに移動する必要があると思います。私にとっては、Cookieを介してこれをハックするよりも簡単なオプションのようです。

于 2008-09-24T09:01:34.620 に答える
0

両方の点で amix に同意します。あなたのコードは一見問題ないように見えますが、これはおそらくサーバー側の何かで処理する方がよいでしょう。

とにかく、推測では、あなたが現在遭遇している問題は、イベントがあなたが思っているように起動していない可能性が高いと思います. 何が起こっているのかを明確にする 2 つの方法は、イベントが発生していることを視覚的に明らかにすることと、出力の冗長性を高めることです。プラグイン、アドオン、キープレスなど、実際に発生するイベントに干渉している可能性があるものはいくつもあります。onload および onunload イベントが発生したときに新しいウィンドウ (またはアラートなど) を開くと、それがわかります。関数が呼び出されていることを確認してください。同様に、元の URL など、より多くのデータを Cookie に保存すると、追加の Cookie を生成しているページをより正確に把握できるようになります。

Firefox 拡張機能の 1 つが断続的に onunload イベントに干渉していると思います。

于 2008-10-08T04:55:20.710 に答える