网站搜索

javascript - AJAX 发送的 POST 请求被重定向取消


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

所以,我在我的 JavaScript 函数中捕获点击事件,使用 jQuery 向一个 PHP 页面发送 POST 请求,该页面将数据保存到 MySQL 中,然后 JavaScript 函数将用户重定向到他们点击的链接的 URL。

我遇到的问题是,似乎因为重定向,POST 操作从未完成。我已经通过在 POST 回调中调用重定向解决了这个问题,但这会增加几秒钟的延迟,因为它要等 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(); 
}

答案#1

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/zh-CN/docs/Web/API/XMLHttpRequest 供进一步阅读。

答案#2

既然你无论如何都会加载页面,为什么还要用 Javascript 发帖?

只需用新页面上点击的链接更新数据库。

也许可以使用引用 URL 来跟踪点击发生在哪个页面。

或者其他解决方法来确定点击发生在哪一页(例如 URL 参数)或其他方式。