2012-08-28 74 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',但它是一個不同的事件類型,所以我不知道你是否會得到你想要記錄的數據。 –

相關問題