Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2007, 06:10
Гость
 
Сообщений: n/a

Проблема закрытия окна (window.close()) в Mozilla и FireFox
Здравствуйте, уважаемые участники.

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

Суть: на "главной" странице есть кнопочка, при нажатии на которую методом open() вызывается всплывающее окно:

<a href="javascript:void(0);" onClick="ShowAddNewsForm();" id="btnAddNews">добавить новость</a>


Сама функция ShowAddNewsForm() находится в подключаемом файле:

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 представляет из себя довольно простой файл:

<!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:

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(docume nt.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(), например, из ссылки в окне

<a href="javascript:window.close();">close</a>

удачно все закрывает.

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

С уважением,
Евгений
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2008, 21:10
Аспирант
Отправить личное сообщение для EugenyK Посмотреть профиль Найти все сообщения от EugenyK
 
Регистрация: 17.03.2008
Сообщений: 64

В FF у меня возникает раз через раз такое сообщение при обычной загрузке страницы на строке 08

tooltipWindow is null

01| function getXHR(){
02|	var xhr
03|	try{
04|		xhr = new ActiveXObject("Msxml2.XMLHTTP")
05|	}
06|	catch(e){
07|           try{
08|			xhr = new ActiveXObject("Microsoft.XMLHTTP")
09|		}
10|		catch(E){
11|			xhr = false
12|		}
13|	}
14|	if(!xhr && typeof XMLHttpRequest != 'undefined') xhr = new XMLHttpRequest()
15|	return xhr
16|}


Почему оно может возникать?
И для чего нужны две попытки запустить M$.XML (в интернете ответа не нашёл, предполагаю, что они отличаются версиями и какая-то из них устаревшая)?
Ответить с цитированием
  #3 (permalink)  
Старый 06.11.2008, 13:34
Аспирант
Отправить личное сообщение для EugenyK Посмотреть профиль Найти все сообщения от EugenyK
 
Регистрация: 17.03.2008
Сообщений: 64

По поводу второго вопроса нашёл кратенькую статейку.
Возможно, кому-нибудь будет интересно http://netfaq.ru/ajax/xmlhttp_creation
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2008, 17:25
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Зачем такие заморочки? Для актуальных браузеров достаточно написать:
var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

ну или построить условие немного по другому, чтобы в IE7 создался XMLHttpRequest, а не ActiveXObject, хотя какая разница.
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2008, 19:22
Аспирант
Отправить личное сообщение для EugenyK Посмотреть профиль Найти все сообщения от EugenyK
 
Регистрация: 17.03.2008
Сообщений: 64

Возможно ты прав.
И конструкцию аля такой:
// Creating XHR object
var getXHR = (function(){
	var xhr
	if(typeof XMLHttpRequest != 'undefined') return function(){ return xhr = new XMLHttpRequest() }
	else if(window.ActiveXObject){
		var xmlVers = ['MSXML2.XMLHttp.4.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp']
		for(var i=0; i<xmlVers.length; i++){
			try{
				xhr = new ActiveXObject(xmlVers[i])
				return function(){ return xhr }
			} catch(err){}
		}
		throw new Error('Невозможно создать объект XMLHttp')
	}
	return function(){ return xhr }
})()

...

var r = eval('('+xhr.responseText+')')

делать смысла нет.

Я поэкспериментировал с объектом 'MSXML2.XMLHttp.5.0' на браузере IE 6.0. Оказалось, что появляется ошибка при обращении к полям объекта r.
(xhr.responseText содержит JSON-строку, созданную посредством многим известной функции php2js().

Занятно, вобщем.

Последний раз редактировалось EugenyK, 06.11.2008 в 19:25.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ещё одна проблема обработки скрипта в Mozilla comcam Firefox/Mozilla 15 27.03.2009 02:22
В Mozilla Firefox 3.0 проблемма с Javascript меню artmedia Элементы интерфейса 1 07.09.2008 10:43
Проблема обработки скрипта в Mozilla ermugard Firefox/Mozilla 2 18.06.2008 17:52