2014-10-27 2 views
0

В качестве опции выбора у меня есть поле выбора HTML, содержащее 20 разных номеров (например, «123456790») с триггером onChange, который инициирует регулярный AJAX POST, который должен задайте текст для определенного элемента HTML. Код выглядит так:Ajax-запрос, возвращающий целую страницу в два раза

HTML

<select id="mtn_select" name="mtn_select" onChange="setDetailValues(this.value);"> 
<option value="0" selected>Please select</option> 
<? 
    foreach ($servicearray as $serviceno => $element) { 
     echo '<option value="'. $serviceno .'">'. $serviceno .'</option>'; 
    } 
?> 
</select> 

JS

function setDetailValues(select_value) { 
    if (select_value == 0) { 
      $('#service_city').text(''); 
    } else { 
    $.ajax({ 
    type: 'POST', 
    url: 'modules/ajax_maintenance.php', 
    data: { servicenumber : select_value }, 
    dataType: 'text', 
    success: function(return_data) 
    { 
     if (return_data) { 
      var myarr = return_data.split("|"); 
      $('#service_city').text(myarr[1]); 
      } else { 
        $('#service_city').text('no data found'); 
      } 
    }, 
    error: function(return_data) 
    { 
      $('#service_city').text('an error occured'); 
    } 
}); 

PHP (ajax_maintenance.php с жестко закодированных значений в настоящее время)

<? 
$service_nr = strtolower($_POST['servicenumber']); 
$service_city = "New York"; 
$service_str = "Someplace 22a"; 
$return_value = ""; 

$return_value = $service_nr ."|". $service_city ."|". $service_str; 
echo $return_value; 
?> 

Теперь это скорее простой, и он работает по назначению, но, к сожалению, все равно ломается, как половина времени. Когда он будет работать, ответ XHR-POST (проверенный через Firebug) будет «123456789 | Нью-Йорк | Где-то 22a», как ожидалось, и значение города будет обновляться просто отлично.

Но каждый ответ POST будет содержать весь код HTML-кода от <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> до последней строки </html>. Когда это происходит, ajax-вызов не распознает его как ошибку или отсутствующие данные, поэтому HTML-код всего веб-сайта будет находиться внутри переменной обратного вызова return_data и распечатывается на веб-сайте, где значение города должно появляются.

Веб-сайт, на котором этот материал интегрирован, немного сложнее с довольно многими (неизвестными мне) php-includes, используя параметры GET для выбранного в данный момент модуля (поэтому все ссылки указывают на index.php с разными параметрами) и идентификатор сеанса текущего пользователя. Сначала я подумал, что это может быть проблемой (из-за свойств аутентификации/авторизации и SID), поэтому я вручную добавил параметры GET к моему ajax-POST, но это ничего не изменило. Я предполагаю, что это должно быть что-то серверное и с обработкой сеанса, но я действительно ошеломлен, почему это не происходит все время и в недоумении, что проверить/изменить, чтобы продвинуться.

+0

Просто предложение, вернуть данные в формате JSON, так что вы не должны делать все, что расщепление бизнеса. Также звучит так, что запрос ajax может возвращать страницу с ошибкой, так как ajax_maintenance.php на самом деле не имеет тегов или чего-то еще. Pastebin весь html вернулся, пожалуйста. – vcanales

+0

Да, используйте JSON, он очень подходит для этого. Что касается вашей проблемы, в следующий раз, когда вы получите сбой, проверьте параметры запроса для исходящего запроса в Firebug. Я подозреваю, вы увидите там что-то неожиданное. – rjdown

+0

это я или это .php-файл не правильный? У него нет правильного тега открытия, что может привести к ошибке (если не включены короткие теги). – KarelG

ответ

0

Значение типа данных вашего почтового запроса выглядит некорректно. Вы должны изменить свой php-скрипт, чтобы вернуть форматированные данные json, и изменить тип данных как json.

Нечто подобное для PHP:

$return_value = json_encode(array($service_nr, $service_city, $service_str)); 
echo $return_value; 
Смежные вопросы