Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.08.2008, 13:32
Интересующийся
Отправить личное сообщение для Nichloas Посмотреть профиль Найти все сообщения от Nichloas
 
Регистрация: 29.07.2008
Сообщений: 11

Кодировка при использовании Ajax
Не могу понять причин возникновения проблемы.

Скачал два файла для работы с ajax. В одном (html) находится форма, которая вызывает работу обработчика (php). Обработчик генерирует строку вывода.

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

После сохранения файла (php) через блокнот (никаких изменений в текст файла не вносилось) в кодировке utf-8 (ранее он тоже был в данной кодировке) обработчик перестал выполняться. Проверил по коду - запуск ajax обработчика выполняется, а вот ответа от него я не получаю. Причем проблема возникает только в IE, а во всех остальных браузерах работает нормально.

В чем проблема? Мне очень важно, чтобы приложение работало и в IE, и в FF, и в Opera, и в NN.
Ответить с цитированием
  #2 (permalink)  
Старый 08.08.2008, 14:13
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

проблема в блокноте.
Ответить с цитированием
  #3 (permalink)  
Старый 08.08.2008, 14:18
Интересующийся
Отправить личное сообщение для Nichloas Посмотреть профиль Найти все сообщения от Nichloas
 
Регистрация: 29.07.2008
Сообщений: 11

А чем тогда воспользоваться? Пробовал использовать EditPlus и Notepad++ - результат тот же. И почему проблема возникает только в IE?

Последний раз редактировалось Nichloas, 08.08.2008 в 14:41.
Ответить с цитированием
  #4 (permalink)  
Старый 08.08.2008, 14:48
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Notepad++ рулит. никогда проблем не было...
Ответить с цитированием
  #5 (permalink)  
Старый 08.08.2008, 15:20
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Nichloas,
Обычно, когда проблема в кодировке серверный скрипт возвращает результат, просто он отображается неправильно. Если вы вообще не получаете ответа - это уже что-то необычное. Выложите минимальные листинги хотя бы. Кстати, удостоверьтесь, что порядок запроса верный:
- XHR.open()
- XHR.onreadystatechange = function() {...}
- XHR.send()
IE больше всех зависим от порядка, например, если обработчик объявлен до open(), то статусы будут проходить верно, но результат обработан не будет.
Ответить с цитированием
  #6 (permalink)  
Старый 08.08.2008, 15:41
Интересующийся
Отправить личное сообщение для Nichloas Посмотреть профиль Найти все сообщения от Nichloas
 
Регистрация: 29.07.2008
Сообщений: 11

Дело в том, что я использую библиотеки jQuery и проблема возникает именно тогда, когда я пытаюсь сохранить файлы без каки-либо изменений.
Скрипты я могу выложить:
form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
<head>
<title>Построение пользовательских интерфейсов на основе библиотеки jQuery</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="js/jquery-1.2.1.js"></script>
<script type="text/javascript" src="js/jquery.form.js"></script>
 
<style type="text/css">
* {
    margin:0;
    padding:0;
}

html, body {
    background-color:#FFF;
    font-family: "Trebuchet MS", Tahoma, Verdana, Arial, Helvetica, sans-serif;
    font-size: 10pt;
}
form {
  margin-left:25px;
}
input, textarea, select {
  display:block;
  width:250px;
  float:left;
  margin-left:10px;
  margin-bottom:10px;
  font-family: "Trebuchet MS", Tahoma, Verdana, Arial, Helvetica, sans-serif;
  font-size: 10pt;
}
optgroup, option {
  font-family: "Trebuchet MS", Tahoma, Verdana, Arial, Helvetica, sans-serif;
  font-size: 10pt;
}
label {
  display:block;
  text-align:right;
  float:left;
  width:105px;
  padding-right:5px;
}
br {
  clear:left;
}
.cb, .rb {
  width:1em;
}
.ms, .ta {
  height:100px;
}
#reset, #submit1 {
  width:87px;
  margin-left:20px;
  margin-top:10px;
}
#submit2 {
  width:87px;
  height:40px;
  margin-left:20px;
}
#output {
  background-color:#F0B80D;
  height:25px;
  overflow:hidden;
  padding:5px;
}
</style>
</head>
<body>
<!-- css и javascript-коды специально размещены непосредственно на странице. -->

<div id="output">AJAX-ответ от сервера заменит этот текст.</div>

<form id="myForm" action="form.php" method="post">
<input type="hidden" name="Hidden" value="hidden Value" /><br />
<label for="Name">Имя:</label>
<input name="Name" type="text" value="Моё имя" /><br />
<label for="Password">Пароль:</label>
<input name="Password" type="password" /><br />
<label for="Multiple">Мультиселект:</label>
<select class="ms" name="Multiple" multiple="multiple">
  <optgroup label="Группа 1">
    <option value="one" selected="selected">Первый элемент</option>
    <option value="two">Второй элемент</option>
    <option value="three">Третий элемент</option>
  </optgroup>
  <optgroup label="Группа 2">
    <option value="four">Четвертый элемент</option>
    <option value="five">Пятый элемент</option>
    <option value="six">Шестой элемент</option>
    <option value="seven">Седьмой элемент</option>
  </optgroup>
</select><br />
<label for="Single">Элемент select:</label>
<select name="Single">
  <option value="one" selected="selected">Первый элемент</option>
  <option value="two">Второй элемент</option>
  <option value="three">Третий элемент</option>
</select><br />
<label for="Single2">Элемент select 2:</label>
<select name="Single2">
  <optgroup label="Группа 1">
    <option value="A" selected="selected">Буква A</option>
    <option value="B">Буква B</option>
    <option value="C">Буква C</option>
  </optgroup>
  <optgroup label="Группа 2">
    <option value="D">Буква D</option>
    <option value="E">Буква E</option>
    <option value="F">Буква F</option>
    <option value="G">Буква G</option>
  </optgroup>
</select><br />
<label for="Check">Чекбоксы:</label>
<input class="cb" type="checkbox" name="Check" value="1" />
<input class="cb" type="checkbox" name="Check" value="2" />
<input class="cb" type="checkbox" name="Check" value="3" /><br />
<label for="Radio">Радиобаттоны:</label>
<input class="rb" type="radio" name="Radio" value="1" />
<input class="rb" type="radio" name="Radio" value="2" />
<input class="rb" type="radio" name="Radio" value="3" /><br />
<label for="Text">Просто текст:</label>
<textarea class="ta" name="Text" rows="2" cols="20">Это элемент textarea</textarea><br />
<input id="reset" type="reset" name="resetButton" value="Reset" />
<input id="submit1" type="submit" name="submitButton" value="Submit1" />
<input id="submit2" type="image" name="submitButton" value="Submit2" src="form.gif" />
</form>


<script type="text/javascript">
$(document).ready(function(){
// ---- Форма -----
  var options = { 
    // элемент, который будет обновлен по ответу сервера 
  	target: "#output",
    beforeSubmit: showRequest, // функция, вызываемая перед передачей 
    success: showResponse, // функция, вызываемая при получении ответа
    timeout: 3000 // тайм-аут
  };
  
  // привязываем событие submit к форме
  $('#myForm').submit(function() { 
    $(this).ajaxSubmit(options); 
    // !!! Важно !!! 
    // всегда возвращаем false, чтобы предупредить стандартные
    // действия браузера (переход на страницу form.php) 
    return false;
  }); 
// ---- Форма -----
});

// вызов перед передачей данных
function showRequest(formData, jqForm, options) { 
    // formData - массив; здесь используется $.param чтобы преобразовать его в строку для вывода в alert(),
    // (только в демонстрационных целях), но в самом плагине jQuery Form это совершается автоматически.
    var queryString = $.param(formData); 
    // jqForm это jQuery объект, содержащий элементы формы.
    // Для доступа к элементам формы используйте 
    // var formElement = jqForm[0]; 
    alert('Вот что мы передаем: \n\n' + queryString); 
    // здесь можно вернуть false чтобы запретить отправку формы; 
    // любое отличное от fals значение разрешит отправку формы.
    return true; 
} 
 
// вызов после получения ответа 
function showResponse(responseText, statusText)  { 
    // для обычного html ответа, первый аргумент - свойство responseText
    // объекта XMLHttpRequest
 
    // если применяется метод ajaxSubmit (или ajaxForm) с использованием опции dataType 
    // установленной в 'xml', первый аргумент - свойство responseXML
    // объекта XMLHttpRequest
 
    // если применяется метод ajaxSubmit (или ajaxForm) с использованием опции dataType
    // установленной в 'json', первый аргумент - объек json, возвращенный сервером.
 
    alert('Статус ответа сервера: ' + statusText + '\n\nТекст ответа сервера: \n' + responseText + 
        '\n\nЦелевой элемент div обновиться этим текстом.'); 
}
</script>
</body>
</html>


form.php
<?php
header('Content-Type: text/html; charset=utf-8');
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    $time = date("H:i:s", time());
	print 'Сервер отвечает: '.$time.' передача данных прошла успешно!';
}
?>


Текст представлен полностью. В базовых файлах все работает (текст тот же). Сохраненный через блокнот, EditPlus глючить в IE , но только в нем
Ответить с цитированием
  #7 (permalink)  
Старый 08.08.2008, 20:59
Интересующийся
Отправить личное сообщение для Nichloas Посмотреть профиль Найти все сообщения от Nichloas
 
Регистрация: 29.07.2008
Сообщений: 11

Кстати, та же проблема возникает, если используется кодировка win-1251. Во всех браузерах, кроме IE работает. Почему?
Ответить с цитированием
  #8 (permalink)  
Старый 17.09.2009, 15:22
dimonius666
 
Сообщений: n/a

Столкнулся с такой же проблемой...но решил таким методом.. c помощью NotePad++ перекодировал в UTF-8 без BOM... и все заработало...а еще добавил в начало ajax кода header('Content-type: text/html; charset=utf-8');
и все заработало...
мож я конечно не прав, но мне помогло
Ответить с цитированием
  #9 (permalink)  
Старый 17.09.2009, 15:25
dimonius666
 
Сообщений: n/a

сори за повторение слов "и все заработало"
Ответить с цитированием
  #10 (permalink)  
Старый 17.09.2009, 16:06
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Вот Вам и ответ. BOM-mark. Он отдается ДО хидера, и в результате мы получаем статус 500
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
смена картинок при нажатии sdff Общие вопросы Javascript 15 08.02.2014 17:08
tinyMCE и ajax Snipe AJAX и COMET 6 01.08.2008 14:49
Не отрабатывает событие onmouseout при внедрении нового слоя ilshat Элементы интерфейса 3 28.07.2008 06:27
Ссылка на объект при использовании attachEvent Octane Events/DOM/Window 13 23.07.2008 17:37
Ajax & Autorun Ergall-M AJAX и COMET 11 08.05.2008 15:33