2012-08-28 39 views
2

我想要做的是记录给定网页上的所有用户活动,所以我使用socket.io发送在页面上注册的事件到服务器这样的事情:注入自定义函数onclick事件

$(document).on('click.mynamespace', function(event){ 
    var elem = event.target; 
    socket.emit('my-message', { 'element' : elem }; 
} 

我现在面临的问题是,当目标元素是这种<a href="#" onclick="someFunctionThatRedirects()">My link</a>的链接。在socket.emit语句正确执行之前,无论调用哪种函数并卸载页面(断开我的套接字)。

我想尽可能通用,因为这将作为一个插件,并希望它适应任何类型的环境,我将无法控制。

那么,有没有办法“强行”所有点击事件,首先用我的自定义函数发送它们,然后继续“正常”执行,无论它是什么?

编辑

看来只有FF(上14.0.1测试)导致socket.emit事件没有结束。 Chrome 21.0.x似乎正在工作,但不知道这是否是“偶然”。

EDIT 2

功能someFunctionThatRedirects实际上以这种方式重定向window.location.ref = clickedurl

+4

作为一个侧面说明,包装和直接解包是多余的。 'event.target'就是'elem'之后的东西。 – pimvdb

+0

你可以推迟重定向到点击事件后 –

+0

哦,是的,抱歉,不知道为什么我写了[0]的东西。 @pimvdb – scanales

回答

0

活动气泡向上,所以点击的元素得到它的事件您socket.emit之前被炒了,你可以改变职能的工作,使道路他们按照你想要的顺序做他们的动作如下

function someFunctionThatRedirects(){ 
    window.redirectTo = 'myNewPage'; 
} 
$(document).on('click.mynamespace', function(event){ 
    var elem = $(event.target)[0]; 
    socket.emit('my-message', { 'element' : elem }; 
    if(window.redirectTo !== undefined) window.location.href = window.redirectTo; 
} 
+1

这可能无法与“尽可能通用,因为这将作为一个插件”的想法很好地发挥。 – pimvdb

+0

正如@ pimvdb所说的,我无法控制这个函数,或者任何可能结束的函数。它迄今为止在所有其他链接上都很好地工作,只在具有内联函数的特定情况下才能完成重定向。 – scanales

+0

那么你可以添加你的函数来侦听'beforeunload',但它是一个不同的事件类型,所以我不知道你是否会得到你想要记录的数据。 –