Помогите с некоторыми неправильными представлениями cookie javascript cookie

im используя следующий код для установки / удаления файлов 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();
}

но я получаю непоследовательные результаты. например, файл cookie, установленный на начальной странице (www.example.com/start), не всегда будет отображаться на следующей странице (www.example.com/foo/thing.jsp). Я устанавливаю cookie «onUnload» на странице, используя

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

и извлечение + удаление «onLoad» через

loadDur = (новая дата ()). getTime () - get_cookie ("beginrequest"); delete_cookie ( "BeginRequest");

для измерения общего количества времени загрузки страницы.

при использовании firebug я часто вижу «оставшиеся» beginrequest-cookie и несколько экземпляров beginrequest с прошлыми временными метками.

как я могу достичь, чтобы увидеть только один файл beginrequest-cookie на каждой странице?

javascript,cookies,

0

Ответов: 4


1

Если вы получаете старые файлы cookie, которые могут быть связаны с тем, что ваша страница содержит много контента, а onload не вызывается перед onunload (потому что страница не заканчивает загрузку). Поэтому удалите файл cookie, вызвав что-то вроде этого как onload, так и onunload:

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

У вас может также быть условие гонки, если вы загрузите следующую страницу достаточно быстро, чтобы файл cookie 'delete_cookie' не истек должным образом, и ваша реализация get_cookie подбирает это. Поэтому попробуйте изменить регулярное выражение в get_cookie только для получения файлов cookie со значением:

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

Кроме того, если вы просматриваете сайт в нескольких окнах (или вкладке), их файлы cookie могут быть запутаны, поэтому не делайте этого. Но попробуйте использовать глобальное регулярное выражение, чтобы забрать все значения и использовать только последний.


1

Повторяя предложение другого сделать часть работы на стороне сервера - я сделал это в прошлом:

1) Захватите время запроса на стороне сервера и включите тег сценария с переменной времени на странице:

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

2) В конце страницы, в JavaScript, получите новое время и вычислите общее время.


0

Ваш код для set_cookie, get_cookie и delete_cookie кажется правильным. И ваше использование.

Я думаю, вы должны переместить это в свой Java-код - для меня это выглядит проще, чем взломать это с помощью файлов cookie.


0

Я согласен с amix по обоим пунктам: ваш код выглядит нормально на первый взгляд, и это, вероятно, будет лучше обрабатываться чем-то на стороне сервера.

несмотря на то, что, предположим, я бы сказал, что проблема, с которой вы сталкиваетесь в данный момент, вероятно, что события не срабатывают так, как вы думаете. двумя способами вы можете прояснить, что происходит, сделать визуально очевидным, что событие стреляет, и увеличивая многословие вашего вывода. любое количество вещей может мешать событиям, которые действительно срабатывают: плагины, аддоны, нажатия клавиш и т. д., если вы открываете новое окно (или предупреждение или что-то еще), когда загораются события onload и onunload, вы сможете сказать что функции вызываются. Аналогично, если вы храните больше данных в файлах cookie, таких как исходный URL и т. д., вы сможете лучше понять, какие страницы генерируют дополнительные файлы cookie.

я бы предположил, что одно из ваших расширений Firefox периодически мешает событию onunload.

JavaScript, печенье,
Похожие вопросы