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

Недавно начал разбираться с 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
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
    #34930372
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В конце функции ShowAddNewsForm() надо поставить return false;
2. В функции alertContents() дважды создана переменная resText. Непонятно, как будет она вести себя дальше.
3. Вне зависимости от отзыва сервера (код 200 или другой) resCode получит значение 1 или 2. Соответственно, последняя проверка не закроет окно, разве только если отзыв с сервера был невалидный.
...
Рейтинг: 0 / 0
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
    #34930413
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор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
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
    #34930422
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, просмотрел ...
В строчке
Код: 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
(AJAX) Проблемы с закрытием окон, вызванных методом open() (Mozilla, FF)
    #34930427
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помогает.

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

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

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


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