Интересное поведение AJAX в IE
Nov. 14th, 2011 12:30 pmПишу очередную фигнюшку для служебных нужд, интерфейс, как обычно, браузерный, а чтобы работать было удобно, как с толстым клиентом, используется максимум AJAX. Сегодня заметили, что в IE всех версий все функции, завязанные на возврат данных, полученных с помощью xmlhttp.responseText (для IE xmlhttp создаётся из ActiveX) выдают ошибку -1072896658. Другие браузеры работают корректно, правда там и xmlhttp создаётся как new XMLHttpRequest().
Цифирь ошибки не гуглится (находятся описания других похожих ошибок, но не этой), пришлось думать самому. Помогло то, что в пятницу всё работало, значит причина ошибки в изменениях, сделанных на выходных. JS-код не менялся, а вот в php-обработчике AJAX изменения были. Я исправлял неверно определяемую кодировку выдачи ответов, ну и для принудительного определения содержимого как UTF-8 скопипастил и другого скрипта строчку.
Кодировку это, конечно, исправило. А всё остальное сломало.
Причина проста: я переправил Content-Type. А у XMLHttpRequest для передачи текстовых данных он всегда должен быть равным application/x-www-form-urlencoded.
Достаточно было убрать замену Content-Type, и всё заработало (правильный контент-тайп ставится в js-скрипте при формировании xmlhttp):
Цифирь ошибки не гуглится (находятся описания других похожих ошибок, но не этой), пришлось думать самому. Помогло то, что в пятницу всё работало, значит причина ошибки в изменениях, сделанных на выходных. JS-код не менялся, а вот в php-обработчике AJAX изменения были. Я исправлял неверно определяемую кодировку выдачи ответов, ну и для принудительного определения содержимого как UTF-8 скопипастил и другого скрипта строчку.
header("Content-Type: text/html; charset=utf-8");
Кодировку это, конечно, исправило. А всё остальное сломало.
Причина проста: я переправил Content-Type. А у XMLHttpRequest для передачи текстовых данных он всегда должен быть равным application/x-www-form-urlencoded.
Достаточно было убрать замену Content-Type, и всё заработало (правильный контент-тайп ставится в js-скрипте при формировании xmlhttp):
header("charset=utf-8");