AJAX帖子被重定向取消

时间:2011-06-09 21:02:13

标签: javascript jquery ajax

我正在编写一个小脚本来捕获链接点击并将链接的URL保存到数据库表中,以便跟踪单击特定页面上每个链接的次数。这些链接指向外部网站。

因此,我在JavaScript函数中捕获click事件,使用jQuery发布到在MySQL中保存数据的PHP页面,然后JavaScript函数将用户重定向到他们点击的链接的URL。

我遇到的问题是,由于重定向,似乎帖子永远不会完成。我通过调用post回调中的重定向来解决这个问题,但是这会增加几秒延迟,因为直到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 个答案:

答案 0 :(得分:7)

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.

您正在寻找readystate 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进一步阅读。

答案 1 :(得分:0)

当您离开页面时,所有待处理的请求都将被终止,并且新页面会加载。第一种方式是正确的方法。是的,单击链接会有延迟,这是因为POST请求正在运行。

如果用户不在该页面上,则无法在页面背景中运行请求。

也许您可以将链接URL保存在cookie中,并在下一页加载时将其放入数据库中。

答案 2 :(得分:0)

为什么要在任何方式加载页面时使用Javascript发布?

只需在新页面上点击链接即可更新数据库。

也许使用引荐来源网址来跟踪点击的页面。

或其他一些解决方案来获取点击的页面(例如url param)或其他方式。

相关问题