2012-08-28 7 views
2

Что я пытаюсь сделать, так это записать всю активность пользователя на заданную веб-страницу, поэтому я использую socket.io для отправки событий, зарегистрированных на странице, на сервер с чем-то вроде этого :Inject custom function to onclick event

$(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 будет выполнен правильно.

Я хочу сделать это как можно более универсальным, так как он будет работать как плагин и хотел бы, чтобы он приспособился к любой среде, в которой я не буду контролировать.

Итак, есть ли способ «взломать» все события щелчка, сначала отправить их с моей пользовательской функцией, а затем продолжить «нормальное» выполнение, каким бы оно ни было?

EDIT

кажется только FF (проверено на 14.0.1) вызывает socket.emit событие не до конца. Chrome 21.0.x, похоже, работает, но не уверен, что это «шанс».

EDIT 2

Функция someFunctionThatRedirects фактически перенаправляет таким образом window.location.ref = clickedurl

+4

В качестве побочного примечания обертывание и прямая разворачивание являются излишними. 'event.target' - это то, что вам нужно для' elem'. – pimvdb

+0

Вы можете отложить перенаправление после события click –

+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», но это другой тип события, поэтому я не знаю, будете ли вы получать данные, которые хотите записать. –