webew
Войти » Регистрация
 
JavaScript

AJAX & IE6

25 мая 2008, 18:05
Автор: AXL
В каких случаях в Internet Explorer 6 может не работать AJAX в то время как в Opera, FF и IE7 работает и как исправить ситуацию.

ЗЫ: домен аякс-шлюза тут не причем))
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

bur

К сожалению, количество экстрасенсов среди наших пользователей слишком мало, поэтому, необходимо уточнить что именно не работает. Для этого можно предпринять следующее:
- проверить уходит ли запрос на сервер (увидеть HTTP-заголовок);
- проверить приходит ли ответ (для IE это можно сделать с помощью плагина IEHttpHeader);
- проверить срабатывает ли callback-функция;
- посмотреть responseText (даже если ответ приходит в виде XML);

Вполне возможно, что причина конфликта не в XHR, а в постороннем коде.
Если выполнение всех рекомендаций не внесет ясность - выкладывайте сюда ваш скрипт.
25.05.2008, 21:53
Ответить
NO USERPIC

AXL

> - проверить уходит ли запрос на сервер (увидеть HTTP-заголовок);
ok
> - проверить приходит ли ответ (для IE это можно сделать с помощью плагина IEHttpHeader);
ok
> - проверить срабатывает ли callback-функция;
ok
> - посмотреть responseText (даже если ответ приходит в виде XML);
null
25.05.2008, 22:26
Ответить

bur

Напишите код вашего XHR-объекта, способ вызова и код callback-функции.
Возможно, что объект, который вы считаете за ссылку на XHR, не является таковым, т.к. не имеет свойство responseText.
25.05.2008, 23:20
Ответить
NO USERPIC

AXL

Ладно не буду Вас мучать дальше, ответ таков:

В шестом осле если не указывать в заголовках ответа кодировку то сам браузер её не определит и не попытается привести к стандартному утф.

Поэтому нужно явно указывать кодировку

header("Content-type: text/html; charset=utf-8");
25.05.2008, 23:28
Ответить

bur

Так это была уже решенная задача :-)
Чтож, тогда я внесу пару дополнений.
Как правило, описанная вами проблема не наблюдается на практике, т.к. большинство серверов дописывают нужный заголовок самостоятельно.
Вот пример: http://2007.fastcoder.ru/demo/ajaxDemo2.html
Вызываемая PHP-функция имеет следующий код:
header("Cache-Control: no-store, no-cache, must-revalidate");
echo "good";


И я бы не стал утверждать о стандартности UTF-8. Всё держится на HTTP-протоколе, так что браузер прекрасно поймет ответ в других кодировках. В моем примере это windows-1251.

А вообще интересный факт, спасибо.
25.05.2008, 23:51
Ответить
NO USERPIC

AXL

Пожалуйста, на практике не раз приходилось решать такую проблему когда сервер принудительно не посылает заголовков о кодировке. Особенно странно было когда лишь аякс лишь в ИЕ6 перестает работать при переносе с одного сервера на другой. Теперь стараюсь следить чтобы в ответе на запрос всегда шёл заголовок с кодировкой. В конце концов это правило хорошего тона на мой взгляд.
26.05.2008, 00:08
Ответить
NO USERPIC

rgbeast

>> большинство серверов дописывают нужный заголовок самостоятельно.

Это происходит в случае, если а apache прописана DefaultCharacterSet. У большинства хостеров рунета эта опция установлена в windows-1251. Вероятно, бага наиболее сильно влияет на англоязычных программеров, многие из которых могли не сталкиваться с понятием кодировки вообще. Стандарт HTTP, насколько я помню не обязывает указывать кодировку, по умолчанию это latin1.

AXL, текст ответа пустой и в случае, если ответ не содержит русских букв?
26.05.2008, 00:27
Ответить
NO USERPIC

AXL

Этот случай можно отнести к ряду специфический примеров того, как может вылезти боком то что мы не делаем того ,что нас не обязывает.=)) ещё можно отнести сюда: не закрывать теги штмл, использовать глобальные переменные, писать неформатированный код, обзывать переменные от вольного(типа name1, name2, zz, xx, spv, ...), не комментировать свой код в конце концов. Я бы назвал это культурой программирования. Я как-то задал вопрос одному программисту "...почему ты так пишешь?...." (после того как просмотрел его код и нашёл много чего что вообще 1 раз в жизни увидел, типа ничинать строку с запятой :\) отвечает - "мне же так удобней". Он видимо не знал что код в 90% случаях читают и в 10% пишут. На следующий вопрос "работал ли ты в команде когда-нибудь" ответ думаю очевиден. Чёто я от темы ушёл совсем))) фриланс ещё портит программистов(не верстальщиков) после него трудно войти в команду....

пасибо за внимание)))
26.05.2008, 01:05
Ответить
NO USERPIC

rgbeast

Вы упомянули важные вопросы, но их можно классифицировать по-разному. Одно дело культура программирования/работа в команде, а другое дело соответствие стандартам. Пересечение конечно есть, но области несовпадающие.

Все-таки, работает ли AJAX в IE6, если сервер возвращает только латинские символы и кодировка в Content-Type не указана? Если нет, то это говорит только о культуре разработки самого IE.

Культура она и в краткости также. Если вы посылаете русский текст, то обязаны указать кодировку. Если посылаете latin1, то о кодировке имеете право не знать ничего.
26.05.2008, 01:47
Ответить
NO USERPIC

AXL

>> Одно дело культура программирования/работа в команде, а другое дело соответствие стандартам.

В разных проектах/командах свои стандарты и правила. Когда работаешь в команде, просто обязан придерживаться установленным правилам и стандартам.
26.05.2008, 02:04
Ответить
NO USERPIC

rgbeast

Все таки не стоит смешивать стандарты и правила. Правила действуют внутри команды. Стандарты устанавливаются для Интернета в целом - например HTTP, HTML, ECMAScript, XML. В начале топика речь шла о соответствии стандартам - неправильно передавать кодированный текст, не указав кодировку. Правила кодирования в команде могут быть любыми, не противоречащими стандартам. Начинать каждую строку программы на C с десяти точек с запятой не противоречит стандартам, значит команда с иными эстетическими ценностями вправе принять для себя такой стиль.
26.05.2008, 02:26
Ответить
NO USERPIC

rgbeast

Не могу воспроизвести:

aja.php: (файл в UTF8, работает также если CP1251)
<?php
header("Content-Type: text/html");
echo "<b>Привет</b>";
?>


aja.html: (тестировался с и без строчки meta - ajax отрабатывает правильно в обоих случаях)
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>

<script type="text/javascript">
var d;
var a;
function ajaxReadyChange ()
{
  if (a.readyState == 4) // data ready
    {
      if ((a.status == 200) || (a.status == 0)) // Ok
        d.innerHTML = a.responseText; // write response
      else
        d.innerHTML = 'Error: (' + a.status + ') ' . a.responseText;
    }
}

function do_save (url, element_name) {
  if (window.XMLHttpRequest) // non-IE
    a = new XMLHttpRequest();
  else if (window.ActiveXObject) // IE
     a = new ActiveXObject("Microsoft.XMLHTTP");
  else {
     alert("Method is not supported. Use \"Save and return\".");
         return;
  }
 
  d = document.getElementById(element_name);
  d.innerHTML = 'Sending...';
 
  a.onreadystatechange = ajaxReadyChange;

  a.open('GET', url, 1);
  a.setRequestHeader("Content-Type","text/html");
  a.send ("");
  return false;
}
</script>
<div id='xx'>P</div>
<a href='' onclick='return do_save("aja.php","xx")'>Save</a>
</body>


[rgbeast@elf ~]$ GET -edS http://***.ru/test/aja.php
GET http://***.ru/test/aja.php --> 200 OK
Connection: close
Date: Tue, 03 Jun 2008 19:39:13 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 13
Content-Type: text/html
Client-Date: Tue, 03 Jun 2008 19:39:13 GMT
Client-Peer: 77.91.227.99:80
Client-Response-Num: 1
X-Powered-By: PHP/5.1.6


Все работает в IE6
03.06.2008, 23:40
Ответить
NO USERPIC

AXL

только что залез на живой сайт(при разработке которого у меня возникала такая проблема) и поэкспериментировал, поисследовал заголовки.

Ситуация следующая:

- на сервере значит по дефалту с какого-то перепугу стоял выброс в win-1251 (я не ошибся!! именно win а не windows)
- в итоге браузер получал ответ в формате utf8, а в заголовке была самому админу известная кодировка. Firefox, Opera и уже 7 IE при обнаружении такой фигни будили в себе инстинкт автооопределения. 6й же ИЕ вешался и говорил о какойто системной ошибке...
06.06.2008, 00:55
Ответить
NO USERPIC

rgbeast

Проверил со строчкой
header("Content-Type: text/html; charset=win-1251");


Подтверждается то, что Вы пишете. Причем не важно в какой кодировке данные - могут быть в latin1. Если кодировка задана ошибочно (не важно win-1251, w12 или qwerty), то IE6 выдает ошибку. Причем, если данные в utf8, а задана кодировка windows-1251, то IE6 работает без ошибки (отображаются кракозябры).
06.06.2008, 01:50
Ответить
NO USERPIC

AXL

> Причем, если данные в utf8, а задана кодировка windows-1251,
> то IE6 работает без ошибки (отображаются кракозябры).

да да да, проверял:)
06.06.2008, 10:16
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100