Материалы
[:NetFAQ://]


Поиск

[:NetFAQ://]


Партнеры
Хостинг от Park-Web

www.popularsite.ru
[:NetFAQ://]


Реклама
Не переплачивай - диваны от производителя.
[:NetFAQ://]


Отправка данных методом POST (AJAX)

Отправка данных методом POST (AJAX)

По просьбам трудящихся. Небольшая функция на JavaScript, которая будет отправлять на сервер данные методом POST получать ответ и выводить его нам.

Что нам надо?

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

Исходные данные:

Сочиним простую форму.
<form name="calc">
    Имя:<input type="text" name="name" onChange="javascript:doLoad('http://netfaq.ru/user_auth/');">
Пароль:<input type="password" name="pass" onChange="javascript:doLoad('http://netfaq.ru/user_auth/');"> Ответ сервера:<input type="text" name="ans"> </form>
onChange - здесь мы вызываем функцию, которая будет передавать данные на сервер. В принципе её можно вызываеть и на другое событие.
В поле ответ сервера, будем выводить данные, которые нам пришлет сервер.

Реализация

function doLoad1(url) {    document.forms["calc"].elements["total"].value="Считаем."
var poststr = "name=" + 
    ncodeURI(document.forms["calc"].elements["name"].value ) + 
    "&pass=" + 
    encodeURI( document.forms["calc"].elements["pass"].value );
//собираем в кучу все элементы формы на сайте
if (window.XMLHttpRequest) {//для нормальных браузеров  
request = new XMLHttpRequest();  //создаем новый запрос
request.onreadystatechange = processRequestChange;  //задаем обработчик событий (описан ниже)
request.open('POST', url, true);//задаем урл и метод открытия
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
// посылаем заголовок, для отправки формы
request.setRequestHeader("Content-length", poststr.length);
//отправляем размер данных в форме *это важно!*
request.setRequestHeader("Connection", "close");
request.send(poststr); //посылаем данные
} else if (window.ActiveXObject) {  //если IE то проделываеться то же самое с поправкой на ветер.
request = new ActiveXObject("Microsoft.XMLHTTP");  
if (request) {  
request.open('POST', url, true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", poststr.length);
request.setRequestHeader("Connection", "close");
request.send(poststr); 
}  
}  
}  
function getRequestStateText(code) {  //функция получает, статус отправленного запроса.
switch (code) {  
case 0: return "Uninitialized."; break;  
case 1: return "Loading..."; break;  
case 2: return "Loaded."; break;  
case 3: return "Interactive..."; break;  
case 4: return "Complete."; break;  
}  
}  
function processRequestChange() { 
// эта функция реагирует на изменение статуса отправленного 
запроса, и если пришел ответ, то выводит его 
abortRequest = window.setTimeout("request.abort();", 10000);//как долго ждать?  
if(request.readyState == 1){
document.forms["calc"].elements["ans"].value="Считаем." ;//выводим если обработка в еще в процессе.
}
if (request.readyState == 4) {  
clearTimeout(abortRequest);  
if (request.status == 200) { //ответ получен от сервера
output = request.responseText;
document.forms["calc"].elements["ans"].value = output;//выводим в форму
} else {  
document.forms["calc"].elements["ans"].value = "не получилось ... "; //если вдруг не получилось
}  
}
}  
Пара замечаний. Скрипт на сервере, работает так же как и при обычной отправке формы. Собрать фому в строку запроса, можно и более красивым способом.

Опубликовано: 2008-06-16 19:20:38 ShadX

Комментарии

Kroko onChange="javascript:doLoad('http://netfaq.ru/user_auth/');" При том в JS написано: function doLoad1(url) и ещё много ошибок... итог: не пашет...
123 7897897
Свят +1
Mr.Hacker Во-первых doLoad1 вместо doLoad, как уже заметили. Во-вторых, для IE не назначен обработчик события onreadystatechange. В-третьих, функция getRequestStateText вообще ни разу не вызвана в коде, значит она здесь лишняя. На 3- понянет.
wqe qwr
3213 213213
7567 567567
Ща посмотрим Комент
dfdsfds fdsfdsf
Серега Если немножко подправить, то всё работает ))) И для оптимизации кода, можно еще вынести в отдельную функцию создание запроса, чтобы следом не повторять 2 раза один и тот же код. И getRequestStateText можно вызвать в какую-нибудь статусную строку как getRequestStateText(request.readyState)
kolya kolya
354 instance
Ramzil_Inxon Не чё тут я не понял...
HhKMUbzoEXYUECHl People normally pay me for this and you are gvinig it away!
AcMxiGoYwN XtWJqb pvdebdxhmqmc
ulNKowkFZiagP UNEYQi , [url=http://atckynyjtrdi.com/]atckynyjtrdi[/url], [link=http://ckfgbnsnvmma.com/]ckfgbnsnvmma[/link], http://nrgffnhutjgx.com/
dBCWIZfQYZqv qe3tzW xrjdojgizizn
AMXpbcbhOmUPXaJNxt 34REX9 , [url=http://qpbmxpqbhmhk.com/]qpbmxpqbhmhk[/url], [link=http://juhpbfcyxodh.com/]juhpbfcyxodh[/link], http://hkpjzophkbfx.com/

Оставить комментарий:

Имя:
Почта:
Комментарий:
Что написанно на картинке;)
[:NetFAQ://]

Справочники
[:NetFAQ://]


FreeSoftware
Графика
Аудио&Видео
CD&DVD
Офис
Системные утилиты
Антивирусы
Игры
Разное
[:NetFAQ://]


Магазин
Вавилон 5 - второй сезон
Вавилон 5 - второй сезон
[:NetFAQ://]


Статистика


[:NetFAQ://]


FAQ Новости Блог RSS Задать вопрос