|
Отправка данных методом 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/
|
|
|
Оставить комментарий:
|
|
|