Сообщение AJAX отменяется при перенаправлении - PullRequest
6 голосов
/ 10 июня 2011

Я пишу небольшой скрипт для захвата щелчков по ссылкам и сохранения URL-адреса ссылки в таблице базы данных, чтобы отслеживать, сколько раз нажимается каждая ссылка на определенной странице. Ссылки на внешние сайты.

Итак, я фиксирую событие click в моей функции JavaScript, использую jQuery для публикации на странице PHP, которая сохраняет данные в MySQL, а затем функция JavaScript перенаправляет пользователя на URL-адрес ссылки, по которой он щелкнул.

Проблема, с которой я сталкиваюсь, заключается в том, что кажется, что сообщение никогда не завершается из-за перенаправления. Я работал над этим, вызывая перенаправление внутри обратного вызова post, но это добавляет задержку в несколько секунд, потому что он вызывается только после завершения публикации. Я ищу способ просто опубликовать данные и сразу же перенаправить пользователя, независимо от того, удачно это сообщение или нет.

Это текущий код с обходным решением. Работает нормально, но добавляет задержку:

function trackClicks(event)
{
    var clicked = $(this).attr('href');

    $.post
    (
        $('#track-click-post-url').attr('value'),
        {
            action: 'track_landing_page_clicks',
            clicked_url: clicked,
            nonce: $('#track-click-nonce').attr('value')
        },
        function( response )
        {
            window.location = clicked;
        }
    );

    event.preventDefault(); 
}

И это то, что я хотел бы сделать, но когда я пытаюсь, это никогда не завершается:

function trackClicks(event)
{
    var clicked = $(this).attr('href');

    $.post
    (
        $('#track-click-post-url').attr('value'),
        {
            action: 'track_landing_page_clicks',
            clicked_url: clicked,
            nonce: $('#track-click-nonce').attr('value')
        }
    );

    window.location = clicked;
    event.preventDefault(); 
}

Ответы [ 3 ]

7 голосов
/ 10 июня 2011

jQuery не предоставляет обратный вызов для того, что вы ищете. Вот доступные состояния готовности:

Value   State   Description
0   UNSENT  open()has not been called yet.
1   OPENED  send()has not been called yet.
2   HEADERS_RECEIVED    send() has been called, and headers and status are available.
3   LOADING Downloading; responseText holds partial data.
4   DONE    The operation is complete.

Вы ищете состояние готовности 2, так как это самое раннее время, когда вы узнали о том, что сервер получил сообщение.

Это должно оторваться от земли:

var xhr = new XMLHttpRequest();
xhr.open("POST", clicked);
xhr.onreadystatechange = function() {
    if (xhr.readyState >= 2) window.location = clicked;
};
xhr.send($('#track-click-post-url').attr('value'));

https://developer.mozilla.org/en/XMLHttpRequest для дальнейшего чтения.

0 голосов
/ 10 июня 2011

Почему вы публикуете, используя Javascript, когда вы собираетесь каким-либо образом загрузить страницу?

Просто обновите базу данных, щелкнув ссылку на новой странице.

Возможно, с использованием URL-адреса реферерачтобы отслеживать, на какой странице был клик.

Или какое-то другое решение, чтобы узнать, на какой странице был клик (например, url param) или каким-либо другим способом.

0 голосов
/ 10 июня 2011

Когда вы покидаете страницу, все ожидающие запросы уничтожаются, а новая страница загружается.1-й путь - это правильный путь.Да, при нажатии ссылки будет задержка, потому что выполняется запрос POST.

Вы не можете выполнить запрос в фоновом режиме страницы, если пользователь не находится на этой странице.

Может быть, вы можете сохранить URL-адрес ссылки в файле cookie и поместить его в БД при загрузке следующей страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...