AJAX GET竞争条件?

时间:2010-07-09 15:20:43

标签: javascript jquery ajax events race-condition

我试图通过类似于以下方法在我的网站上点击链接时跟踪事件。

<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不是。 e.g:

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

请注意,我并不担心AJAX请求的结果......我只是希望它能够通过发生事件来ping服务器。

(另外,我希望我能得到至少一个答案,说明只是从服务器端跟踪新的页面加载,而不是客户端。这不是这个问题的可接受的答案。我我正在寻找像谷歌分析'trackPageview函数如何在锚点标记的点击事件上工作的东西,无论是否加载新页面。)

2 个答案:

答案 0 :(得分:3)

通过像查尔斯这样的代理运行Google的trackPageview方法,显示调用trackPageview( )请求设置了各种参数的Google服务器的像素,这就是大多数分析软件包最终实现这些功能的方法( Omniture做同样的事情。)

基本上,为了避免异步请求未完成,他们让客户端请求图像并在服务器端处理这些请求中传递的参数。

为此,您需要实现相同的功能:编写一个实用程序方法,从您的服务器请求图像,通过URL参数传递您感兴趣的信息(类似于/track.gif?page = foo.html&安培;链接=点击%20Me&安培;巴=巴兹);然后,服务器将在数据库中记录这些参数并发送回gif。

之后,它只是切割和切割您收集的数据以生成报告。

答案 1 :(得分:1)

马特,

如果您只是想确保跟踪像素请求已经完成并且您不依赖于响应,那么只需为跟踪像素图像执行document.write即可完成工作。

你可以在onclick处理程序中执行document.write。

锚点元素的href和onclick处理程序之间的AFA竞争条件与订单的定义有关。

首先执行事件处理程序脚本 之后发生默认操作(在这种情况下,默认处理程序是href) (来源:Href and onclick issue in anchor link

但是,是的,如果您依赖于跟踪请求对服务器的响应,那么您必须使其同步。

建议的选项是调用一些javascript函数来包装已定义的onclick处理程序,然后按顺序进行调用。确保您的跟踪请求不是异步的。

虽然建议您不要依赖于跟踪像素请求的响应。