Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF) / 7 сообщений из 7, страница 1 из 1
10.11.2007, 07:56
    #34929695
I_Work
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
Здравствуйте, уважаемые участники.

Недавно начал разбираться с AJAX-ом. Сейчас пишу маленькуя системку администрирования новостей на сайте.

Суть: на "главной" странице есть кнопочка, при нажатии на которую методом open() вызывается всплывающее окно:
Код: plaintext
1.
<a href="javascript:void(0);" onClick="ShowAddNewsForm();" id="btnAddNews">добавить новость</a>

Сама функция ShowAddNewsForm() находится в подключаемом файле:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function ShowAddNewsForm() {
	var options = "";
	options += "directories = no,";
	options += "height = 200,";
	options += "width = 300,";
	options += "left = 20,";
	options += "top = 200,";
	options += "menubar = no,";
	options += "location = no,";
	options += "scrollbars = no,";
	options += "resizale = no,";
	options += "status = no,";
	options += "toolbar = no";

	window.open("news/news_form.html", "_blank", options);
}

news_form.html представляет из себя довольно простой файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Добавить новость</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link href="news_form.css" type="text/css" rel="stylesheet">
<script language="JavaScript" src="news_form.js"></script>
</head>

<body>
<textarea id="txt">текст новости</textarea>
<input type="checkbox" id="visible" value="visible"> опубликовать
<input type="submit" id="btnAdd" value="добавить" onClick="AddNews()">
</body>
</html>

news_form.js :
Код: 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.
function AddNews() {
	var http_request = false;
	if (window.XMLHttpRequest) {
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) http_request.overrideMimeType('text/plain');
	}
	else if (window.ActiveXObject) {
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	http_request.onreadystatechange = function() { alertContents(http_request); };
	http_request.open("POST", "news_add.php", true);
	http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
	http_request.setRequestHeader("Charset", "windows-1251");
	http_request.send("txt="+encodeURIComponent(document.getElementById("txt").value));
}

function alertContents(http_request) {
	var resCode =  0 ;
	var resText = "";

	if (http_request.readyState ==  4 ) {
		if (http_request.status ==  200 ) {
			var resText = http_request.responseText;
			if(!(/^\d+$/.test(resText))) resCode =  2 ;
		} else {
			resCode =  1 ;
			resText = "Не удалось подключиться к серверу.";
		}

		if(resCode >  0 ) alert(resText);
		else window.close();
	}
}

Скрипт news_add.php пытается добавить новость в БД и, если новость успешно добавлена, возвращает id этой новости из таблицы БД. В противном случае возвращается текст ошибки.

Как видно, пока в родительское окно я ничего не передаю. JavaScript проверяет, вернулось ли ID или ошибка. Если ID, то я пытаюсь закрыть окно, иначе - вывод текста ошибки alert-ом.

Проблема:
Mozilla и FireFox ведут себя не очень хорошо - окно вовсе не закрывается сразу. Чтобы оно закрылось, необходимо кликнуть в любое его место. При этом простой вызов window.close(), например, из ссылки в окне
Код: plaintext
<a href="javascript:window.close();">close</a>
удачно все закрывает.

Помогите, пожалуйста, решить проблему.

С уважением,
Евгений
...
Рейтинг: 0 / 0
11.11.2007, 00:44
    #34930372
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
1. В конце функции ShowAddNewsForm() надо поставить return false;
2. В функции alertContents() дважды создана переменная resText. Непонятно, как будет она вести себя дальше.
3. Вне зависимости от отзыва сервера (код 200 или другой) resCode получит значение 1 или 2. Соответственно, последняя проверка не закроет окно, разве только если отзыв с сервера был невалидный.
...
Рейтинг: 0 / 0
11.11.2007, 03:15
    #34930413
I_Work
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
автор1. В конце функции ShowAddNewsForm() надо поставить return false;
Пробовал ставить return (причем и true, и false) и в конце функции, и даже сразу после закрытия окна (мне пока дальнейших действий не требуется). Ничего не помогает.

автор2. В функции alertContents() дважды создана переменная resText. Непонятно, как будет она вести себя дальше.
Этот момент я и в самом деле проглядел, но все равно, исправление не помогает.

автор3. Вне зависимости от отзыва сервера (код 200 или другой) resCode получит значение 1 или 2. Соответственно, последняя проверка не закроет окно, разве только если отзыв с сервера был невалидный.
Почему же это? Изначально переменная res установлена в 0 и изменяется только, если произошла ошибка (1 - если статус не 200, 2 - если вернулось не id).
Более того, могу с уверенностью сказать, что фрагмент window.close() обрабатывается:
1) если заменить его, скажем, на alert() или еще какой, то в этом легко убедиться,
2) окно замечательно закрывается в IE, Avant и Opera

Mozilla и FireFox тоже окно "закрывают", только оно не исчезает сразу. Чтобы оно исчезло, на него надо кликнуть (в любое место, кроме заголовка) или передать фокус любому его элементу. Интересно, что за заголовок окно можно даже перемещть по экрану.

Еще один момент - если ПОСЛЕ window.close() поставить alert(), то после закрытыя окна сообщения "главное" окно закрывается (по видимому, ему просто передается фокус - это аналогично тому, что я просто кликну по окну).

Но мне этот alert() не очень-то нужен. Да и теперь это уже дело принципа - разобраться, почему браузеры себя так ведут...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function alertContents(http_request) {
	var resCode =  0 ;
	var resText = "";

	if (http_request.readyState ==  4 ) {
		if (http_request.status ==  200 ) {
			resCode =  0 ;
			resText = http_request.responseText;
			if(!(/^\d+$/.test(resText))) resCode =  2 ;
		} else {
			resCode =  1 ;
			resText = "Не удалось подключиться к серверу.";
		}

		if(resCode >  0 ) alert(resText);
		else {
			window.close();
			alert("Window has just been closed.");
		}
	}
	return false;
}
...
Рейтинг: 0 / 0
11.11.2007, 05:02
    #34930422
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
Блин, просмотрел ...
В строчке
Код: plaintext
http_request.onreadystatechange = function() { alertContents(http_request); };
тоже нужен возврат:
Код: plaintext
http_request.onreadystatechange = function() { alertContents(http_request); return false;};

Или в вызове
Код: plaintext
<input type="submit" id="btnAdd" value="добавить" onClick="AddNews()">
нужно добавить
Код: plaintext
<input type="submit" id="btnAdd" value="добавить" onClick="AddNews(); return false;">

Это вроде мелочь, доходчиво не объясню, лень искать, но сам попадал на такой "просак".
Ну и еще такой "финт": событий onClick не существует, есть onclick. Основные броузеры не реагируют, но бывает с менее известными.
...
Рейтинг: 0 / 0
11.11.2007, 05:20
    #34930427
I_Work
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
Не помогает.

IE и Opera работаю нормально, а Mozilla и FF не хотят сразу закрывать окно - ждут, когда одному из элементов передастся фокус...
...
Рейтинг: 0 / 0
11.11.2007, 13:41
    #34930605
I_Work
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
В архиве - все необходимые файлы и скрипты.

Проблема: в IE и Opera окно закрывается нормально. В Mozilla и FF окно закрывается только после очередного получения фокуса.

Если кому интересно, прошу посмотреть.
...
Рейтинг: 0 / 0
13.11.2007, 05:14
    #34933975
I_Work
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
Вопрос остается открытым.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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