jQuery + Kohana - проблема отправки данных ajax

NewTor

Новичок
jQuery + Kohana - проблема отправки данных ajax

Проблема заключается в том, что в IE не приходит ответ от сервера посредством AJAX запроса (на клиенте фреймворк - JQuery, на сервере - Kohana). В других браузерах все работает нормально.
Код клиента:
Код:
function TakeRegion(idr){
$.post('/registration/take_region', {id: idr}, function(data){                
 $('#region').html(data);         
   } ); 
}
На сервере, фрагмент кода контроллера (вызываемый метод):
PHP:
public function take_region(){ 
    if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
    $id = $this->input->post('id');                
    $town = $this->region->GetCountry($id);                 
    if($town->count() == 0)                        
        $sel = '';                 
    else{
        $sel = '<select name=region_id>';
        foreach($town as $row){
            $sel .= '<option value='.$row->region_id.'>'.$row->name.'</option>'; 
        }
    $sel .= '</select>';
    }                 
     echo $sel;
  }
}
Фрагмент HTML-кода:
Код:
<select onchange="TakeRegion(this.value);">
<!-- Код сформированный сервером-->
</select>
<div id="region"></div>
При клике на тэге select вызывается javascript функция TakeRegion, которая получает значение идентификатора клика idr. Затем она асинхронно отправляет постом запрос на сервер методу take_region (это метод класса контроллера) и передает в него параметр id. Метод take_region формирует html код нового тэга select. После этого клиентская функция TakeRegion получает сформированный сервером код в возвратную функцию, которая вызывается в случае успешного прохождения запроса. Так вот, в браузере IE до вызова возвратной функции дело не доходит. В остальных браузерах все работает прекрасно. Может дело в настройках IE? Я не смог найти причину.
 

Активист

Активист
Команда форума
Во-первых.

Тебе не важно какой, какой сервер.
Проблема, скорее всего в самом JS, которые не понимает твой IE.

> что в IE не приходит ответ от сервера посредством AJAX запроса

Для начала, тебе нужно проверить, что посылает твой браузер и какой ответ идет от сервера. Для этого можно взять утилиту
IE HTTP Analyzer (на nnm.ru можно найти, название вроде такое). Она позволяет снифить HTTP трафик любого приложения и в отличном интерфейсе его анализировать.

Кроме того, для изменения селектов в jquery лучше использовать не возврат и инкапсуляцию HTML, а json. Ответ посылается в JSON серилизованном виде (обьекте), далее, заменяешь (добавляешь или удаляешь) значения

Библиотека - http://www.texotela.co.uk/code/jquery/select/
(в упакованном виде весит 3.1 кб)

Применять примерно следующим образом

Код:
	$.ajax({
		type: "POST",
		url: url,
		dataType: "json",
		data: data,
		async: false,
		global: true,
		beforeSend: function() {
			$("#js_geo_loading").show();
		},
		success: function (result) {
                $("#js_select").removeOption(/./)
                $("#js_select").addOption(result.options); 
                },
		error: function(XMLHTTPObj) {
			alert("Произошла ошибка при выполнении AJAX запроса, возможно страница не найдена. Ответ от сервера"+XMLHTTPObj.responseText);
		}
	});
Серилизованный массив выглядит примерно так
PHP:
exit(json_encode(array("options" => array(1 => "option 1",2=> "option 2", 5 => "option 3"))));
Естественно, json от сервера идет в utf8

-~{}~ 24.01.09 17:54:

Еще подозреваю, что твой браузер не посылает по какой-то причине заголовок
f($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
 

pilot911

Новичок
разницы быть не должно, json используешь или инкапсуляцию JS в страницу

надо бы посмотреть ответ в виде JS - тогда что-то можно сказать
 

NewTor

Новичок
, большое спасибо за совет. Поставил IE HTTP Analyzer и просмотрел заголовки reques и response.
Еще подозреваю, что твой браузер не посылает по какой-то причине заголовок
f($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
Этот заголовок как раз-таки исправно отправлялся. Причина оказалась до глупости банальной. Для IE нужно явно прописывать кодировку и тип. Достаточно было поставить
Код:
header('Content-Type: text/html; charset=utf-8');
и все заработало!
В любом случае, огромное спасибо участникам беседы за помощь.
 
Сверху