Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление данных через XMLHttpRequest, посылка запросов на сервер через POST 
:(
    Опции темы
Black
Дата 19.6.2005, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 2
Всего: 45



Скрипт:

Код

// Скрипт для отправки запросов на сервер без обновления страницы методом POST.
// Author: PHP-DIRECTOR <[email protected]>
// Протестировано в IE 6.0, FireFox 1.0, Opera 8.01

function createRequestObject()
{
if (window.XMLHttpRequest) { var obj = new XMLHttpRequest(); }
else {
        var obj = new ActiveXObject('Msxml2.XMLHTTP');
        if(!obj) { var obj = new ActiveXObject('Microsoft.XMLHTTP'); }
     }
return obj;
}

function ReLoad(url,data)
{
 var Req = createRequestObject();
 Req.onreadystatechange = function(){if(Req.readyState==4&&Req.status==200) { eval(Req.responseText); }};
 Req.open('POST',url,true);
 Req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 Req.send(data);
}

setInterval('ReLoad("name.php","name1=value1&name2=value2")', 5000);


Данный код посылает данные методом POST на сервер без перезагрузки страницы.
Причем посылка данных происходит каждые 5 сек через setInterval.

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

Надеюсь, этот код будет кому-то полезен.

Ответ от сервера должен содержать JavaScript-код который будет выполнен на странице через eval()

Если будете использовать скрипт в ваших проектах желательно сохранять копирайт или хотя бы меня известите.

Работает в MSIE 6.0, FireFox 1.0, Opera 8.01


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Irokez
Дата 19.6.2005, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



а если у меня имеется форма и требуется послать все поля из этой формы .. мне как, упаковывать все данные в виде строки: name1=value1&name2=value2?

PM   Вверх
Black
Дата 19.6.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 2
Всего: 45



Цитата
а если у меня имеется форма и требуется послать все поля из этой формы .. мне как, упаковывать все данные в виде строки: name1=value1&name2=value2?


Да. Каждому элементу формы можно дать id, затем при нажании на опр. кнопку на которую мы повесим функцию, которая пробежит по всем полям формы.

Код

var name1 = document.getElementById(id).value;


а затем сформируем переменную data

Код

url = 'name.php';
data = 'name1='+name1+'&name2='+name2 и т.д.


затем все данные скормим приведенному выше скрипту.

Код

ReLoad(url,data);





--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Irokez
Дата 19.6.2005, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Цитата(PHP @ 19.6.2005, 01:08)
Да. Каждому элементу формы можно дать id, затем при нажании на опр. кнопку на которую мы повесим функцию, которая пробежит по всем полям формы.

не вряд ли smile лучше по-другому получить элементы.. через массив form[]
но вопрос в другом: отправятся ли данные если:
а) много полей
б) большой объем информации, например текст (содержащий переход на новую строку)
PM   Вверх
Black
Дата 19.6.2005, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 2
Всего: 45



Irokez
Цитата
лучше по-другому получить элементы.. через массив form[]

ну это кто во что горазд smile

Цитата
отправятся ли данные если много полей

да отправятся.

Цитата
например текст (содержащий переход на новую строку)

необходимо преобразовать в UTF-8, иначе будут глюки.

Необходимо каждое поле формы пропустить через:
encodeURIComponent(element);

а затем сформировать date где все данные скрепить через &
но не надо саму переменную date пропускать через encodeURIComponent(element);



--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Irokez
Дата 19.6.2005, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Цитата(PHP @ 19.6.2005, 01:39)
а затем сформировать date где все данные скрепить через &
но не надо саму переменную date пропускать через encodeURIComponent(element);

т.е. data..
а ошибки 414 too long request не будет? smile
PM   Вверх
Sardar
Дата 19.6.2005, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Кодом всё сказанное выше:
Код
<form id="test">
<input type="text" name="tt">
<input type="checkbox" name="ch" value="bla bla">
<input type="radio" name="rd" value="r1">
<input type="radio" name="rd" value="r2">
<input type="radio" name="rd" value="r3">

<input type="button" onclick="alert(encodeForm(this.form));" value="test">
</form>
<script type="text/javascript">
<!--
// Скрипт для отправки запросов на сервер без обновления страницы методом POST.
// Author: PHP-DIRECTOR <[email protected]>
// 
// getInputValue and encodeForm by Sardar <[email protected]>
//
// Протестировано в IE 6.0, FireFox 1.0, Opera 8.01
function createRequestObject() {
  if (window.XMLHttpRequest) return new XMLHttpRequest();
  try {
    return new ActiveXObject('Msxml2.XMLHTTP');
  } catch(e) {
    return new ActiveXObject('Microsoft.XMLHTTP');
  }
}

function ReLoad(url ,data) {
 var Req = createRequestObject();
 Req.onreadystatechange = function(){if(Req.readyState==4&&Req.status==200) { alert(Req.responseText); }};
 Req.open('POST',url,true);
 Req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 Req.send(data);
}

function encodeForm(form) {
  if(!form||!form.elements) throw "encodeForm: error, argument is not a FORM";
  var ret=[], el;
  for(var i=0; i<form.elements.length; i++) {
    el=form.elements[i];
    if("checkboxradio".indexOf(el.type)>=0) {if(el.checked) ret[ret.length]=getInputValue(el);}
    else if(el.type!="button"&&el.type!="submit") ret[ret.length]=getInputValue(el);
  }
  return ret.join("&");
}

function getInputValue(inp) {
  if(typeof(inp.nodeName)=="undefined") { //collection of radio
    for(var i=0; i<inp.length; i++)
      if(inp[i].checked) return (inp[i].name? encodeURIComponent(inp[i]).name+"=":"") + encodeURIComponent(inp[i].value);
    return "";
  }
  if(inp.type=="select-multiple") {
    var ret=[];
    for(var i=0; i<inp.options.length; i++)
      if(inp.options[i].selected) ret[ret.length]=(inp.options[i].name? encodeURIComponent(inp.options[i].name)+"[]=":"")+encodeURIComponent(inp.options[i].value);
    return ret.join("&");
  } else if(inp.type=="select-one")
     return (inp.selectedIndex>=0)?
       ((inp.options[inp.selectedIndex].name? encodeURIComponent(inp.options[inp.selectedIndex].name)+"=":"")+encodeURIComponent(inp.options[inp.selectedIndex].value)) : "";
  if(inp.type=="image") return (inp.name? encodeURIComponent(inp.name)+"=":"")+encodeURIComponent(inp.src);
  else return (inp.name? encodeURIComponent(inp.name)+"=":"")+encodeURIComponent(inp.value);
}

setInterval('ReLoad("name.php",encodeForm(document.getElementById("test")))', 5000);
//-->
</script>

Добавлено @ 02:32
Цитата(Irokez @ 19.6.2005, 01:05)
а ошибки 414 too long request не будет?

Данные постом идут, там хоть мегабайты.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Irokez
Дата 19.6.2005, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Sardar то что нужно! спасибо!
PM   Вверх
Burrr
Дата 4.9.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: нет
Всего: 20



Замечательный код. Есть только вопрос насчёт копирайта, о котором говорится в первом посте (я в этой теме не проф, поэтому прошу извинить, если кого-то случайно обидят мои рассуждения).
Насколько я понимаю первый скрипт отличается от обычно-используемого для httpRequest-запросов тем, что в него добавлена строка для Оперы:
var obj = new ActiveXObject('Msxml2.XMLHTTP');
, а также нехитрая функция setInterval().
В чём же такая изюминка этого скрипта, чтобы предупреждать (хоть и желательно) автора об его использовании?
Неужели настолько оригинальная идея?


--------------------
PM MAIL ICQ   Вверх
Aliance
Дата 4.9.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 6
Всего: 137



Burrr
Используй PM --Resize_Images_Alt_Text-- для задания таких вопросов, IMHO.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 4.9.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Burrr изначальный код это стандартный, везде описываемый пример, можешь написать "с нуля" сам и поставить свой копирайт smile
Доработанный мной код это уже оригинальная идя. Я придумал и реализовал идею, но это не значит что код накладывает какие либо ограничения на использование. Можешь написать по новой сам, либо взять приведённый код. Во втором случае просто добавь имена и мыло тех, кто работал над кодом, просто из уважения.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Burrr
Дата 5.9.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: нет
Всего: 20



Ясно, спасиба!
Просто интересно было узнать.

Это сообщение отредактировал(а) Burrr - 5.9.2005, 10:07


--------------------
PM MAIL ICQ   Вверх
Guest
Дата 17.11.2005, 14:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











стоп...
что то вы меня запутали

Sardar
а в чем разница между громоздким кодом который описан, у Котерова(JSHttpRequest), твоим JSInteractiveRequest или компактным этим?

кроме метода передачи, разницы не вижу...
и там и там обновление страницы...
  Вверх
Sardar
Дата 18.11.2005, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Цитата(Guest @ 17.11.2005, 13:43)
а в чем разница между громоздким кодом который описан, у Котерова(JSHttpRequest), твоим JSInteractiveRequest или компактным этим?

В поддержке браузерами. Например мой код не будет работать в Opere 8 и Netscape 8, т.к. те категорически отказываються запускать динамически созданные скрипты, вернее запускают, но аргументы убиваються. Это никак не обходиться, только использованием XMLHttpRequest вместо этого. В либе Котерова как раз такой подход реализован, если есть возможность использовать XMLHttpRequest, то он и используеться, иначе альтернативный способ скриптами.

В коде DIRECTOR используеться только XMLHttpRequest.

Как вывод: либа Котерова вобрала в себя оба подхода тем самым может работать почти везде, хотя плата за это немного разбухшим кодом. Все кто спрашивает динамику, советую именно её, т.к. свою никак не добью, нет времени smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
fregs
Дата 18.11.2005, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 25.11.2004

Репутация: нет
Всего: 1



Sardar
smile добивай свою...
у Котеровской возникает проблема у пользователей ИЕ5... кодировка
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.