Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Проблема с Ajax в OnClick / 3 сообщений из 3, страница 1 из 1
05.03.2010, 13:01:32
    #36504825
Dennis2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Ajax в OnClick
Добрый день всем!

Товарищи, помогите кто чем может :). Стоит задача учета URL, на который посетитель переходит с текущей страницы. Для этого я пытаюсь использовать ajax в OnClick каждой ссылки страницы. Следующий код всем хорош, и отлично работает на компе, но не в интернете. Я так понимаю, что связанно это со скоростью интернета посетителя. Что мне надо сделать - мне надо выяснить, как приостановить переход пользователя по ссылке до того, как будет получен ajax-ответ (с максимальным сроком ожидания в секунду, например, ну или без него вовсе). Я читал много про синхронный и асинхронный ajax, но при синхронном ajax речь кругом идет о приостановки выполнения скрипта, а вот что делать, когда надо приостановить переход по ссылке непонятно. Если обратите внимание в коде есть переменная ret, в неё сохраняется значение возвращаемое возможной предыдущей функцией из OnClick, и в зависимости от нее срабатывает или не срабатывает ajax (так как если возвращается false, то посетитель реально не переходит по ссылке, а значит учитывать "переход" не стоит). По моему сельскому разумению OnClick выполняется ДО перехода по ссылке, и поскольку ajax-запрос у меня синхронный, то переход должен приостанавливаться подобно тому, как он приостанавливается, когда при OnClick вызывается обыкновенный alert(). Но почему-то переход срабатывает проскакивая мой ajax и не дожидаясь ответа.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
var bc_stat = new Object();
bc_stat.save = function()
{
	for (var i= 0 ; link = document.links[i]; i++) {
		link.onclick = function(x){
			return function(e){
				var ret = true;
				if (typeof x == 'function') ret = x();

				if (ret != false)
				{
					var targ;
					if (!e) var e = window.event;
					if (e.target) targ = e.target;
					else if (e.srcElement) targ = e.srcElement;
					if (targ.nodeType ==  3 ) // defeat Safari bug
						targ = targ.parentNode;

					bc_stat.ajaxRequest('ping-trackexitlink.php?url='+escape((window.decodeURI)?window.decodeURI(targ.href):targ.href)
						+'&'+Math.random());
				}

				return ret;
			}
		}(link.onclick);
	}
};

bc_stat.ajaxRequest = function(url)
{
	var xmlhttp;
	if ( window.XMLHttpRequest )
	{
		// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		// code for IE6, IE5
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}

	xmlhttp.open('GET', url, false);
	xmlhttp.send(null);
};

bc_stat.save();

Как можно решить такую проблему? И вообще, можно ли?
...
Рейтинг: 0 / 0
05.03.2010, 13:25:02
    #36504899
Dennis2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Ajax в OnClick
Буквально только-что набрел на литературу о событии OnBeforeUnload, которое, как утверждается, приостанавливает переход на URL до получения ответа от синхронного запроса ajax, но кажется он работает только в IE4+ и FF1.7+. Может это частично поможет решить задачу...
...
Рейтинг: 0 / 0
05.03.2010, 19:25:25
    #36505701
Dennis2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Ajax в OnClick
Разобрался немного с OnBeforeUnload и код чудесно работает в IE и FF, но как можно осуществить хотя бы частичную поддержку данной операции в Опере?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
var bc_stat = {
	exitlink: 'no exit link'
};

bc_stat.save = function()
{
	window.onbeforeunload = function(e)
	{
		if (!e) var e = window.event;
		bc_stat.ajaxRequest('ping-trackexitlink.php?url='+escape((window.decodeURI)?window.decodeURI(bc_stat.exitlink):bc_stat.exitlink)
			+'&'+Math.random());
	};

	for (var i= 0 ; link = document.links[i]; i++) {
		link.onclick = function(x){
			return function(e){
				var ret = true;
				if (typeof x == 'function') ret = x();

				if (ret != false)
				{
					var targ;
					if (!e) var e = window.event;
					if (e.target) targ = e.target;
					else if (e.srcElement) targ = e.srcElement;
					if (targ.nodeType ==  3 ) // defeat Safari bug
						targ = targ.parentNode;

					bc_stat.exitlink = targ.href;
				}

				return ret;
			}
		}(link.onclick);
	}
};

bc_stat.ajaxRequest = function(url)
{
	var xmlhttp;
	if ( window.XMLHttpRequest )
	{
		// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		// code for IE6, IE5
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}

	xmlhttp.open('GET', url, false);
	xmlhttp.send(null);
};

bc_stat.save();
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Проблема с Ajax в OnClick / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]