Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.08.2012, 06:29
Новичок на форуме
Отправить личное сообщение для LMnet Посмотреть профиль Найти все сообщения от LMnet
 
Регистрация: 08.09.2011
Сообщений: 5

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

Последний раз редактировалось LMnet, 17.08.2012 в 06:48.
Ответить с цитированием
  #2 (permalink)  
Старый 19.08.2012, 21:27
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

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

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

Последний раз редактировалось platedz, 19.08.2012 в 21:33.
Ответить с цитированием
  #3 (permalink)  
Старый 19.08.2012, 21:43
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

попробуйте так
$('#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;
	}
Ответить с цитированием
  #4 (permalink)  
Старый 22.08.2012, 12:23
Новичок на форуме
Отправить личное сообщение для LMnet Посмотреть профиль Найти все сообщения от LMnet
 
Регистрация: 08.09.2011
Сообщений: 5

Я понял, в чем была проблема.
Если посмотреть на данный код:
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;
Ответить с цитированием
  #5 (permalink)  
Старый 22.08.2012, 12:26
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от LMnet
Решением в моем случае являлось выполнение перехода по ссылке с небольшой задержкой.
Правильнее было вызывать функцию дальнейшего продолжение действий из саlback Аякса
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2012, 05:22
Новичок на форуме
Отправить личное сообщение для LMnet Посмотреть профиль Найти все сообщения от LMnet
 
Регистрация: 08.09.2011
Сообщений: 5

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с addClass и removeClass в Firefox klev2004 Общие вопросы Javascript 1 04.07.2012 18:20
Проблема с событием клика Garik Events/DOM/Window 2 28.06.2011 16:28
Проблема с ЯваСкрипт в Mozilla Firefox 3 ScarHead Firefox/Mozilla 8 30.06.2009 16:55
Проблема закрытия окна (window.close()) в Mozilla и FireFox Гость AJAX и COMET 4 06.11.2008 19:22
Специфичная проблема в firefox Ufai Rock Общие вопросы Javascript 1 23.10.2008 16:55