1

Тема: AJAX запросы

Здравствуйте все.

Стыдно признать, но никогда ранее не пробовал писать асинхронные запросы, но некоторое время назад стали нужны.
Вроде бы как ничего и сложного, но на грабли уже пару раз наступал. Вот сейчас опять. Гуглить уже не получается.

Вот 2 кода. Какой правильный (если таковой имеется)?

url1 = "http://"; url2 = "http://"; param1="300"; param2="400";

xmlhttp = new XMLHttpRequest();

SendRequestPOST(url1, param1, Request1);
SendRequestPOST(url2, param2, Request2);

function Request1() {
    if (xmlhttp.readyState === 4) {
        if (xmlhttp.status === 200) {
            alert("1 запрос отработал");
        }
    }
}

function Request2() {
    if (xmlhttp.readyState === 4) {
        if (xmlhttp.status === 200) {
            alert("2 запрос отработал");
        }
    }
}    

function SendRequestPOST(url, parameter, func) {
    xmlhttp.open("POST", url, true);
    xmlhttp.onreadystatechange = func;        
    xmlhttp.setRequestHeader("Content-type", "application\/x-www-form-urlencoded");
    xmlhttp.overrideMimeType("text/html;charset=windows-1251");
    xmlhttp.send(parameter);
}

и

url1 = "http://"; url2 = "http://"; param1="300"; param2="400";

xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", url1, true);
xmlhttp.onreadystatechange = Request1;        
xmlhttp.setRequestHeader("Content-type", "application\/x-www-form-urlencoded");
xmlhttp.overrideMimeType("text/html;charset=windows-1251");
xmlhttp.send(param1);


xmlhttp2 = new XMLHttpRequest();
xmlhttp2.open("POST", url2, true);
xmlhttp2.onreadystatechange = Request2;
xmlhttp2.setRequestHeader("Content-type", "application\/x-www-form-urlencoded");
xmlhttp2.overrideMimeType("text/html;charset=windows-1251");
xmlhttp2.send(param2);

function Request1() {
    if (xmlhttp.readyState === 4) {
        if (xmlhttp.status === 200) {
            alert("1 запрос отработал");
        }
    }
}

function Request2() {
    if (xmlhttp2.readyState === 4) {
        if (xmlhttp2.status === 200) {
            alert("2 запрос отработал");
        }
    }
}

Вопрос такой: При многократных запросах, достаточно создать объект (чmlhttp = new XMLHttpRequest()) один раз или создавать всегда новый? (xmlhttp1, xmlhttp2, xmlhttp3...)

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: AJAX запросы

При многократных запросах, достаточно создать объект (чmlhttp = new XMLHttpRequest()) один раз или создавать всегда новый?

Достаточно создать один раз.

3

Re: AJAX запросы

Сегодня Гугл стал работать гораздо лучше чем вчера.
Ответ нашелся в mozill-овских мануалах.
Уже не в первый раз именно Мозилла дает ответы.

Спасибо всем.

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: AJAX запросы

Хороший ресурс: - http://xmlhttprequest.ru/

( 2 * b ) || ! ( 2 * b )

5

Re: AJAX запросы

Читал, читал. Но описанную выше "проблему", этим ресурсом я решить не смог.

Нас невозможно сбить с пути, нам пофигу куда идти.

6

Re: AJAX запросы

application\/x-www-form-urlencoded

Обратный слеш лишний, достаточно написать application/x-www-form-urlencoded.

Эту?

DnsIs пишет:

При многократных запросах, достаточно создать объект (чmlhttp = new XMLHttpRequest()) один раз или создавать всегда новый?

Не задумывайтесь об этом. Тем более, если Вы напишите несколько вспомогательных функций для обслуживания запросов, то заметите, что это не так важно.

Создание объекта xmlhttp не трудоемкая процедура, отсутствием переменной xmlhttp в глобальной области видимости тоже можно не беспокоиться, когда все решается с помощью функций обратного вызова. Например:


function ajaxQuery(url, options)
{
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open(options.method || 'GET', url, options.async, options.username, options.password);

	var result;

	if ( typeof options.onreadystatechange == 'function' ) {
		xmlhtp.onreadystatechange = function()
		{
			result = options.onreadystatechange(xmlhttp);
		};
	}

	if ( options.headers ) {
		for (var p in options.headers) {
			xmlhttp.setRequestHeader(p, options.headers[p]);
		}
	}

	xmlhttp.send(options.content);

	return result;
};

Синхронный запрос


var URL = <...>;

var html = ajaxQuery(URL, {
	onreadystatechange: function(xmlhttp)
	{
		if ( xmlhttp.readyState == 4 && xmlhttp.status == 200 ) {
			return xmlhttp.responseText;
		}
	}
});

Асинхронный запрос, выполненный в среде WSH


var URL = <...>;

var complete = false;
var html;
ajaxQuery(URL, {
	async: true, 
	onreadystatechange: function(xmlhttp)
	{
		complete = xmlhttp.readyState == 4;
		if ( complete && xmlhttp.status == 200 ) {
			html = xmlhttp.responseText;
		}
	}
});

// Ждем завершения асинхронного запроса
while ( ! complete ) {
	WScript.Sleep(100);
}
( 2 * b ) || ! ( 2 * b )

7

Re: AJAX запросы

Вот 1 пример (мой, в 1 посте) у меня не работает. Хотя может быть ошибка как раз и не в том месте в котором я думаю. Пошел читать ваши мысли. Спс.

Нас невозможно сбить с пути, нам пофигу куда идти.

8

Re: AJAX запросы

Rumata пишет:

...complete = xmlhttp.readyState == 4...

Какой интересный финт. Чем больше изучаю JavaScript/Jscript, тем меньше понимаю. 8)

Нас невозможно сбить с пути, нам пофигу куда идти.

9

Re: AJAX запросы

Какой интересный финт.

Обычный финт. Сравниваем свойство и константу, результат сравнения присваиваем переменной.

10

Re: AJAX запросы

alexii пишет:

Какой интересный финт.

Обычный финт. Сравниваем свойство и константу, результат сравнения присваиваем переменной.

Суть то я понял (не понял не уснул бы 8), но сам такую конструкция не употреблял.

Нас невозможно сбить с пути, нам пофигу куда идти.

11

Re: AJAX запросы

Коллеги, интересная темка...
насколько я понимаю, после беглого просмотра, через Ajax запрос можно передавать хоть переменные, хоть файлы ? Причём по ходу дела в обоих направлениях (Клиент <->Сервер)
Не ?
Случайно ни у кого рабочего примерчика серверной стороны на ASP нет ? (для передачи имени переменной + её значение) в направлении сервер -> клиент.

Времени не хватает... :-(

12

Re: AJAX запросы

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

Евген пишет:

через Ajax запрос можно передавать хоть переменные, хоть файлы

И да и нет. Нельзя передать переменные, можно передать значения, хранимые в переменных. Есть определенные трудности браузерной реализации то ли POST-запросов, то ли пересылки файлов.

DnsIs, коллеги
Не сочтите за рекламу. По ссылке ниже есть модуль для работы с Ajax. Код далек от совершенства, но он рабочий и я его иногда использую. И с успехом.
http://code.google.com/p/jsxt/source/br … js/Ajax.js

( 2 * b ) || ! ( 2 * b )

13

Re: AJAX запросы

Rumata, AJAX с легкостью реализуется с помощью сторонних библиотек, это да. Тот же jquery например. А так же, кажется, в greasemonkey/scriptish есть прекрасные функции для работы с запросами. Но ведь хочется научится самому. Так ведь. А за ссылку спасибо.

Нас невозможно сбить с пути, нам пофигу куда идти.