Состояние гонки AJAX GET?

Я пытаюсь отслеживать события, когда на моем сайте нажимаются ссылки, с помощью метода, аналогичного следующему.

<a href="/example" class="track">Example</a>

<script type="text/javascript">
    jQuery(function($) {
        // track clicks on all anchor tags that require it
        $('a.track').live('click', function(e) {
            // send an AJAX request to our event tracking URL for the server to track it
            $.get('/events/track', {
                    url: $(this).attr('href'),
                    text: $(this).text()
            });
        });
    });
</script>

Проблема, с которой я столкнулся, заключается в том, что загрузка новой страницы прерывает запрос AJAX, и поэтому иногда эти события не отслеживаются. Я знаю, что в Google Analytics есть _trackPageview функция, которую можно прикрепить к событиям onclick, и это не кажется проблемой для этого. Мне интересно, чем их вызов отличается от моего, потому что я вижу это состояние гонки, а GA - нет. например.:

<a href="/example" onclick="javascript:pageTracker._trackPageview('/click/example');">Example</a>

Обратите внимание, что меня не беспокоит результат запроса AJAX ... Я просто хочу, чтобы он проверял связь с сервером с тем фактом, что произошло событие.

(Кроме того, я ожидаю получить хотя бы один ответ, в котором говорится, что нужно просто отслеживать загрузку новой страницы со стороны сервера, а не со стороны клиента. Это неприемлемый ответ на этот вопрос. Я ищу что-то вроде того, как функция Google Analytics trackPageview работает с событием клика тегов привязки независимо от загрузки новой страницы.)


person Matt Huggins    schedule 09.07.2010    source источник


Ответы (2)


Запуск метода trackPageview Google через прокси-сервер, такой как Charles, показывает, что вызовы trackPageview( ) запрашивают пиксель с серверов Google с различными заданными параметрами, и именно так большинство пакетов аналитики завершают реализацию таких функций (Omniture делает то же самое).

По сути, чтобы обойти незавершенные ансинхронные запросы, клиент запрашивает изображение и обрабатывает параметры, переданные в этих запросах, на стороне сервера.

Со своей стороны, вам нужно будет реализовать то же самое: написать служебный метод, который запрашивает изображение с вашего сервера, передавая интересующую вас информацию через параметры URL (что-то вроде /track.gif?page=foo. html & link = Щелкните% 20Me & bar = baz); затем сервер записывает эти параметры в базу данных и отправляет обратно гифку.

После этого он просто разрезает собранные вами данные для создания отчетов.

person ajm    schedule 09.07.2010
comment
Как это предотвращает состояние гонки? Пиксель загружается не в режиме AJAX? Например, загружается ли он на страницу в теге изображения через document.write? Или объект Javascript Image () используется аналогично тому, как раньше выполнялась предварительная загрузка изображений для ролловеров? Я просто хочу убедиться, что реализую это правильно, так что у меня не будет такого же состояния гонки, возникающего по-новому. Спасибо! :) - person Matt Huggins; 09.07.2010
comment
Что ж, по сути вся работа ведется на стороне сервера. Единственная ответственность клиента - отправить запрос; он может вставить изображение на страницу, если необходимо, но реальное действие попадает на сервер и позволяет серверу записывать то, что ему было отправлено. В этом случае вы можете создать новое изображение, отправить запрос Ajax, загрузить скрипт и т. Д., Пока вы делаете запрос на сервер. - person ajm; 09.07.2010
comment
Что ж, это в первую очередь возвращает меня к моей проблеме. Я делаю запрос на получение AJAX, но иногда он не доставляется на сервер до загрузки запрошенной страницы в теге привязки. Как я могу убедиться, что с загрузкой изображения не будет такой проблемы? - person Matt Huggins; 09.07.2010
comment
Я попытался покопаться в коде GA, и похоже, что они используют объект Javascript Image. то есть: var image = new Image(1,1); image.src="tracking_pixel_url.gif"; - person Matt Huggins; 10.07.2010
comment
Загрузка изображения на клиенте на самом деле здесь ничего не делает; скорее, всю магию творит запрос к серверу. - person ajm; 12.07.2010

Мэтт,

Если вы просто хотите убедиться, что запрос пикселя отслеживания сделан и вы не зависите от ответа, тогда просто выполните document.write для изображения пикселя отслеживания.

И вы можете сделать document.write в своем обработчике onclick.

Состояние гонки AFA между обработчиком href и onclick элемента привязки касается того, что порядок четко определен.

сначала выполняется сценарий обработчика событий, затем выполняется действие по умолчанию (в этом случае обработчик по умолчанию - href) (Источник: Проблема с Href и onclick в якорной ссылке)

Но да, если вы зависите от ответа сервера на запрос отслеживания, вам придется сделать его синхронным.

Предлагаемый вариант - вызвать некоторую функцию javascript, чтобы обернуть уже определенные обработчики onclick, а затем в порядке выполнения вызовов. Убедитесь, что ваш запрос отслеживания не является асинхронным.

Хотя предполагается, что вы не должны зависеть от ответа на запрос пикселя отслеживания.

person rbk    schedule 25.01.2011