Передача и прием данных методами GET и POST в JavaScript

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1196
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Передача и прием данных методами GET и POST в JavaScript

Сообщение mihas »

Когда писал калькулятор цветовых различий столкнулся с ограничением на количество знаков, передаваемых от страницы к странице методом GET в адресной строке. Сервер принимал чуть более 4000 знаков а мне хотелось в идеале передавать 50000 и более (например сравнение двух таблиц ECI2002 на 1617 полей). Пришлось воспользоваться методом POST, когда данные передаются серверу скрытно не в адресной строке. Сразу скажем - возможности передать и принять данные POST, в отличие от GET, сам по себе JavaScript не поддерживает. Чтобы передать данные POST надо воспользоваться html-костылем - скрытым полем инпут в форме, а чтобы принять - без PHP не обойтись ну никак. Покажу подробнее. Мне же не данные, введенные в форму, надо передать, а массив переменных. С методом GET просто - сформировал из массива строку с разделителями & и прилепил к гиперссылке после вопросительного знака, отправил так:

Код: Выделить всё

window.location='гиперссылка'+'?'+строка
и потом принял в документе с помощью метода location.search. С методом POST нужен примерно вот такой костыль:

Код: Выделить всё

<form name="post" method="post" action="colordiff.php?post">
<input type="hidden" name="X1" value="" />
</form>
Теперь отправим данные при помощи JavaScript:

Код: Выделить всё

document.post.X1.value = "?"+hyper;
document.post.submit();
hyper - это переменная - строка с данными. Вот такой костыль: ввели в скрытый (hidden) инпут нашу переменную и отправили.
Теперь надо принять переменную в файле colordiff.php, и javaScript без помощи PHP принять данные POST не может, ведь данные принимает сервер а не клиенсткий компьютер, значит нужен серверный сценарий. Вот второй костыль с включением кусочка кода на PHP в тело JavaScript (скрипт размещается внутри страницы php а не отдельным файлом js). Заметим что в первой строчке приведенного ниже кода мы принимаем данные методом GET, проверяем их, и если их содержимое равно "?post" - принимаем данные методом POST. Вот содержание яваскрипта в файле colordiff.php, к которому мы обратились ранее:

Код: Выделить всё

var get = location.search;  //переменной get присваивается все содержимое адресной строки начиная с вопросительного знака
if (get == '?post')  {
get = "<?php echo $_POST['X1']; ?>"; // переменной get присваивается содержание, переданное методом POST
//alert(get); }
Вот теперь переменной get присваевается на сервере значение переменной X1, переданной методом POST. Условие я создал для того, чтобы небольшое количество данных передавать в адресной строке методом GET: так можно поделиться ссылкой.

Код: Выделить всё

window.location="colordiff.php"+"?"+hyper;
А при слишком длинной переменной hyper передавать ее как X1 методом POST: ссылкой конечно на результаты не поделишься, зато калькулятор все же считает любые таблицы. Ну а если содержание адресной строки отличается от пометки ?post и содержит данные, переданные методом GET, то нам уже не надо ничего принимать методом POST, сразу берем данные из адресной строки и режем по разделителям "&" в массив "adress", отсекая первый знак "?" в строке:

Код: Выделить всё

var adress = new Array();
if (get != '') {
adress = (get.substr(1)).split('&');
но это уже другая история. Заметим, что если PHP ничего не принял методом POST, никакой переменной X1 не было, то он возвращает пустое значение а не что-то типа NaN или Undefined, что в моем случае очень удобно: не надо писать дополнительных условий: ведь get = "".

Как передать скрипту методом POST данные от пользователя в виде текстового файла можно прочитать здесь.
Аватара пользователя
mihas
Администратор
Сообщения: 1196
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Re: Передача и прием данных методами GET и POST в JavaScript

Сообщение mihas »

Небольшое дополнение по свежим версия php. Теперь вместо пустого значения несуществующей переменной php выдает ошибку. Может так и правильнее - не суть. Просто требуется внести исправление в приведенный выше скрипт, теперь правильно прием данных POST выглядит у меня так:

Код: Выделить всё

if (get == '?post')  {
get = "<?php if (isset($_POST['X1'])) {echo $_POST['X1'];}?>";}
То есть здесь php еще определяет - существует ли переменная $_POST. Ее же может и не быть, если мы просто открыли страницу со скриптом, а не передавали ей данные. Ее так же нет в случае с данными GET и теперь php выдает ошибку, а не пустое значение прямо в тело нашего яваскрипта. Исправляем, теперь будет get = "" - и никакой ошибки от свежей версии php.
Ответить

Вернуться в «JavaScript»