【发布时间】:2014-08-15 07:59:59
【问题描述】:
我正在开发一个有多个指向其他网站的链接的网站。我想要的是发送一个ajax调用来报告当有人点击并离开页面时用户正在离开。我在点击链接时发出警报,这有效,但由于某种原因,控制器永远不会得到 ping。
任何有关如何实现它的帮助将不胜感激。
【问题讨论】:
标签: javascript jquery ajax node.js
我正在开发一个有多个指向其他网站的链接的网站。我想要的是发送一个ajax调用来报告当有人点击并离开页面时用户正在离开。我在点击链接时发出警报,这有效,但由于某种原因,控制器永远不会得到 ping。
任何有关如何实现它的帮助将不胜感激。
【问题讨论】:
标签: javascript jquery ajax node.js
做不到。
当您导航离开时,只有一个事件可以捕捉到它,即onbeforeunload 事件,它的功能非常有限。
更不用说还有其他方法可以在不导航的情况下离开页面:
您唯一能做的就是设置一个heartbeat 之类的东西,每隔几毫秒就对服务器执行一次 ping 操作并显示“我还活着”。
但是,根据您要执行的操作,通常会有更好的选择。
【讨论】:
<a href="http://example.com/forward?url=http://example2.com/>example2.com</a>
您可以尝试简单地设置click 事件处理程序,它将在导航之前检查每个链接的href 属性。如果它转到另一个网站,处理程序会发送 AJAX 请求,然后(在服务器响应后)重定向到该页面。
var redirect = '';
$('a').click(function() {
if (this.href.host != document.location.host) {
if (redirect) return false; // means redirect is about to start, clicking other links has no effect
redirect = this.href;
$.ajax({
url: '/away',
success: function(){document.location.href = redirect;}
});
return false;
});
但是,如果用户在多个选项卡中打开了您的页面,它就无法正常工作。
【讨论】:
目前唯一可靠的方法是挂钩(即添加事件侦听器)您的代码在所谓的sendBeacon 方法中来自Beacon API 的beforeunload 事件(即当用户尝试离开页面)。
navigator.sendBeacon() 方法通过 HTTP 将少量数据异步发送到 Web 服务器。它旨在用于将分析数据发送到 Web 服务器,并避免了用于发送分析的传统技术的一些问题,例如使用 XMLHttpRequest:
<script>
var URL = 'https://your.domain/your-page.php';
// on 'beforeunload'
window.addEventListener('beforeunload', function (event) {
navigator.sendBeacon(URL);
// more safely is to wait a bit
var wait_until = new Date().getTime() + 500;
while (new Date().getTime() <= wait_until);
});
</script>
【讨论】:
你可以试试:
$(window).on('beforeunload', function(){
return "This should create a pop-up";
});
【讨论】:
onbeforeunload发送一个ajax请求。
您可以通过捕获页面上所有链接(或所有相关链接)的点击来实现它,然后在其上调用ev.preventDefault() 以防止浏览器直接导航到该页面。
相反,您可以对您的服务器进行 AJAX 调用,当该调用返回时,您可以将 window.location 设置为用户尝试导航到的 URL。
【讨论】:
这是您可以尝试的解决方法。
在页面加载时,使用 jquery 将所有 href 属性移动到 tempHref 属性中。然后,附加一个方法来捕获点击事件。
这样,点击链接不会自动移动到预期的目的地。 当点击发生时,只需执行ajax调用,然后使用javascript,移动到另一个页面。
$('a').each(function () {
var link = $(this);
link.attr('tempHref', link.attr('href'));
link.removeAttr('href');
});
$(document).on('click', 'a', function ()
{
//perform ajax call;
location.href = $(location).attr('tempHref');
});
【讨论】: