Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблема с событием клика в Firefox (https://javascript.ru/forum/events/30823-problema-s-sobytiem-klika-v-firefox.html)

LMnet 17.08.2012 06:29

Проблема с событием клика в Firefox
 
Здравствуйте. Делаю следующее: при клике на ссылку должен отправляться ajax запрос, и только после этого должен быть переход по ссылке. В опере и хроме все норм, а вот фаерфокс обрабатывает только нажатие на среднюю кнопку. Вот код:
function clickHandler(event){
	var request = '';
	request = '/ajax/events/show_drop/'+user_id+'/'+$(this).data('event_id');
	$.get( request );
}
$('#event_window a[data-event_id]').mousedown(function(event){
	if( event.which == 1 || event.which == 2 ){
		event.preventDefault();
		if( event.which == 2 ){
			//тут средняя кнопка обрабатывается
			clickHandler.call(this, event);
		}
	}
}).mouseup(function(event){
	if( event.which == 1 || event.which == 2 ){
		event.preventDefault();
		if( event.which == 1 ){
			//тут левая кнопка обрабатывается
			clickHandler.call(this, event);
			window.location = $(this).attr('href');
		}
	}
});

Отдельные обработчики для mousedown и mouseup сделано потому, что левая кнопка должна смотреть на событие mouseup, а средняя на mousedown.
Когда я смотрел в firebug, почему-то событие mouseup даже не вызывалось при клике на ссылку. Я добавил костыль вот такого вида:
mousedown(function(event){
	if( event.which == 1 || event.which == 2 ){
		event.preventDefault();
		if( event.which == 2 ){
			//тут средняя кнопка обрабатывается
			clickHandler.call(this, event);
		}else if($.browser.mozilla){
			//тут левая кнопка обрабатывается, фаерфокс почему-то не вызывает mouseup
			clickHandler.call(this, event);
			window.location = $(this).attr('href');
		}
	}
})

То есть добавил обработку запроса внутри события mousedown. Но все равно, происходит просто переход по ссылке, результата аяксового запроса я не наблюдаю.

platedz 19.08.2012 21:27

Если происходит переход по ссылке значит наверное Вы не остановили событие по умолчанию.

Кроме прочего, мне кажется событие mouseup может выполниться только если выполнилось событие mousedown, т.к. все функции наверное должны выполняться последовательно. Учитывая, что функции, так сказать пересекаются, то их наверное следует разнести или выполнить mouseup внутри mousedown

cyber 19.08.2012 21:43

попробуйте так
$('#event_window a[data-event_id]').mousedown(function(event){
	if( event.which == 1 || event.which == 2 ){
		event.preventDefault();
		if( event.which == 2 ){
			//тут средняя кнопка обрабатывается
			clickHandler.call(this, event);
		}
       return false;
	}

LMnet 22.08.2012 12:23

Я понял, в чем была проблема.
Если посмотреть на данный код:
clickHandler.call(this, event);
window.location = $(this).attr('href');

То видно, что сперва вызывается функция clickHandler, а потом уже происходит переход по ссылке. Но JS асинхронный язык, поэтому он не ждет результата выполнения предыдущей функции, а идет дальше. В моем случае, просто не успевал выполниться аякс запрос внутри функции clickHandler, происходило сразу выполнение кода:
window.location = $(this).attr('href');

Решением в моем случае являлось выполнение перехода по ссылке с небольшой задержкой. Я использовал функцию setTimeout и передал в нее замыкание, внутри которого выполнялся переход:
//тут левая кнопка обрабатывается
clickHandler.call(this, event);
var href = $(this).attr('href');
function link(){
	var func = function(){
		window.location = href;
	}
	return func();
}
setTimeout(link, 50);
return false;

Deff 22.08.2012 12:26

Цитата:

Сообщение от LMnet
Решением в моем случае являлось выполнение перехода по ссылке с небольшой задержкой.

Правильнее было вызывать функцию дальнейшего продолжение действий из саlback Аякса

LMnet 23.08.2012 05:22

Мне не нужно ждать окончания аякс запроса, мне нужно его только отправить и перейти по ссылке. Небольшая задержка незаметна юзеру, и все работает. А если бы я ждал ответа от сервера, то задержка могла быть разная и явно дольше.


Часовой пояс GMT +3, время: 20:10.