我正在编写一个小脚本来捕获链接点击并将链接的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();
}
答案 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'));
答案 1 :(得分:0)
当您离开页面时,所有待处理的请求都将被终止,并且新页面会加载。第一种方式是正确的方法。是的,单击链接会有延迟,这是因为POST请求正在运行。
如果用户不在该页面上,则无法在页面背景中运行请求。
也许您可以将链接URL保存在cookie中,并在下一页加载时将其放入数据库中。
答案 2 :(得分:0)
为什么要在任何方式加载页面时使用Javascript发布?
只需在新页面上点击链接即可更新数据库。
也许使用引荐来源网址来跟踪点击的页面。
或其他一些解决方案来获取点击的页面(例如url param)或其他方式。