Ajax + возвращение данных после переадресации

Arik

Новичок
Ajax + возвращение данных после переадресации

Проблема в следующем. Есть форма с элементами которой можно осуществлять некоторые действия. Манипуляции происходят без перезагрузки страницы с помощью Ajax. После отправления запроса, со стороны сервера мы видем следующую картину:
1. Запись в БД
2. Переадресация
3. Вывод результата с актуальной таблицей

Проблема возникла именно из-за переадресации и только с одним браузером - Opera.
Вот JS код:

var req;
var reqTimeout;
var tag;

Формируем запрос
function ajax(url,tag_id) {
url = url + "&ajax=on";
tag=tag_id;
// для "родного" XMLHttpRequest
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = req_change;
req.open("GET", url, true);
req.send(null);
// для версии с ActiveX
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = req_change;
req.open("GET", url, true);
req.send();
}
}
if (req)
reqTimeout = setTimeout( function(){ req.abort(); handle_error("Timeout") }, 20000);
}

// Получаем результат
function req_change() {

if (req.readyState == 4) {
clearTimeout(reqTimeout);

if (req.status == 200) {
make_result(req.responseText);
req=null;
}
else if (req.status == 302 ) {
req=null;
ajax(document.location,tag); // Изврат специально для оперы - хреново
}
else {
handle_error(req.statusText);
req=null;
}
}
}

make_result - обрабатывает результат, но это уже не важно

В IE и FF после переадресации (на тот же домен, естественно) выдается статус 200 и результат, в Opera - 302 и отсутсвие результата. Пришлось временно организовать повторный запрос, так как после обработки попадаем на ту же страницу. Хотелось бы понять, как можно получить данные после переадресации для Opera или хотя бы получить реальный адрес, сформированый после переадресации, чтобы сделать по нему повторный запрос.
 

Arik

Новичок
Как механизм сброса всех параметров, влияющих на БД. Кнопка обновить в браузере в итоге всегда вызывает только вывод информации, и никогда действие.
 

IIIEPJIOK

Новичок
Для начала, я бы посоветовал разобраться, что опера отправляет на сервер такого, что сервер отвечает 302, а не 200, а для этого нужно глянуть в заголовки "от Оперы"
 

Arik

Новичок
Вот заголовок полученый через apache_request_headers()
Array
(

[User-Agent] => Opera/9.0 (Windows NT 5.1; U; en)

[Host] => localhost

[Accept] => application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1

[Accept-Language] => en

[Accept-Encoding] => deflate, gzip, x-gzip, identity, *;q=0

[Referer] => http://localhost/testdrive/admin?division=catalog&id=4

[If-Modified-Since] => Sun, 16 Mar 2008 04:51:30 GMT

[Cookie] => PHPSESSID=30efcf499f94c27081a565c4f04bb92f

[Cookie2] => $Version=1

[Connection] => Keep-Alive, TE

[TE] => deflate, gzip, chunked, identity, trailers

)

А вот строка обращения из access.log:
127.0.0.1 - - [16/Mar/2008:07:54:55 +0300] "GET /testdrive/admin?division=part&action=move&direction=1&id=26&root_id=4&ajax=on HTTP/1.1" 302 5737
 

maxwell

artifex
Arik, вы могли бы описать последовательность действий?
Т.е. что делает пользователь, куда вы его переадресовываете и для чего это нужно?
 

IIIEPJIOK

Новичок
Мне кажется я асилил.....
Клиент -К
Сервер -С
К - дай мне то-то xmlhttpRequest.send();
С - иди туда-то header(Location:...), как результат, ответ 302.
К - если опера, останавливается и ждет действий программера,
если ФФ или ИЕ идут куда послал сервер.....

Дык, получается. что без повторного запроса никак, такова реализация XMLHTTPRequest в опере, может даже более логичная, чем в ИЕ и ФФ.....
или хотя бы получить реальный адрес, сформированый после переадресации
XMLHTTPRequest.getResponseHeader()
 

Arik

Новичок
Arik, вы могли бы описать последовательность действий?
Т.е. что делает пользователь, куда вы его переадресовываете и для чего это нужно?
Пользователь видит список строк в таблице, жмет на стрелочку, поменять местами с соседней, идет запрос к серверу через Ajax с параметром ajax=on. В бд происходят некие действия, сохраняется новый порядок записей. Идет переадресация с припиской ajax=on. Сервер формирует страницу вывода. При наличии ajax=on - не полную, только необходимую часть. Эта часть в виде ResponseText подхватывается скриптом как ответ и ставится в соответсвующую область.
Почему переадресация - собственно уже объяснил, крайне удобный способ сбрасывать все "активные" параметры и POST данные. Почему в Ajax тоже, хотя вроде как не актуально - потому что система едина, все определяется лишь надо подключать полный шаблон или нет, в остальном механизм идет тот же.

Дык, получается. что без повторного запроса никак, такова реализация XMLHTTPRequest в опере, может даже более логичная, чем в ИЕ и ФФ.....
Хорошо, но как получить собственно адрес для повторного обращения, тогда встает такая проблема. Я смотрел через req.getAllResponseHeaders() - в опере при переадресации он вообще пустой выдает.
 

maxwell

artifex
Arik, во-первых все браузеры 302 кидают. Видимо ие и фф подстраиваются.

Идет переадресация с припиской ajax=on. Сервер формирует страницу вывода.

Зачем отправлять два запроса?
Для того чтобы скинуть POST данные? Зачем?
 

Arik

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

Пока я вижу только один вариант, при обработке с ajax=on вместо переадресации, выводить адрес страницы, а дальше вызывать запрос по нему.
 

maxwell

artifex
Arik, именно. Сделайте два запроса раз уж они выполняют разные задачи.
 

dimagolov

Новичок
вообще по-моему ajax post запрос ника не может повториться "случайно", если только не посылать его по событию onload. соответственно ценность всей бодяги по переадресации именно для ajax запросов мне представляется крайне сомнительной, и ИМХО от нее можно просто отказаться.
 

maxwell

artifex
К словам dimagolov'a могу добавить только то, что не можно, а нужно отказатся.

Продумывайте тчательнее что собираетесь делать и к каким результатам это приведет.

И, да, обычно тут стараются помочь, а не отписатся, поэтому ваше замечание, по поводу ответа на поставленный вопрос, неуместно.
 

Arik

Новичок
При Ajax - стоит об этом подумать, хотя надо взвесить объемы, ибо он только в административной части и очень выборочно применяется, там где реально полезен. Два запроса здесь погоды не сыграют, а очень не хотелось бы делать разную систему для простой смены страниц и частичной. В любом случае, спасибо за ответы.
 
Сверху